Phone List POJ-3630 字典树 or 暴力
2024-10-07 06:42:08
Phone List POJ-3630 字典树 or 暴力
题意
目前有 t 组数据, n 个电话号码,如果拨打号码的时候 先拨通了某个号码,那么这一串号码就无法全部拨通。
举个例子 911 和 9112016652 相比 后者就无法被拨通,因为 911 会先被拨通。
如果都可拨通 输出 YES 不然输出 NO。
解题思路
这里我是对insert函数进行了修改,在插入的过程中进行判断。
具体过程是这样的,flag数组记录两个信息,一是以这个结点结尾是不是一个完整的字符串,如果是那么就赋值为1,如果这个结点不是一个完整的字符串的结尾的话,那么这个结点是不是一个长字符串的中间结点呢?如果是,那么就赋值为-1。如果是0的话,那么说明这个点没有字符串经过,更谈不上是一个字符串的结尾了。这样我们在插入一个新的字符串的时候就要进行判断了,判断什么?判断这个结果的结点是不是前面一个已经插入结点的结尾,如果是的话,那么这个样例就可以结束了,后面的输入也不用再次插入了,节省时间。
另一个方法是进行sort函数对字符串进行排序,这个让我眼前一亮,字符串也可以排序!之后就是进行模拟了。
代码实现
字典树
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
int tree[maxn][11];
int flag[maxn];
int tot;
bool insert(char *str)
{
int len=strlen(str);
int root=0;
for(int i=0; i<len; i++)
{
int id=str[i]-'0';
if(!tree[root][id])
tree[root][id]=++tot;
if(flag[root]==1) //表示这个点是一个完整的数
return false;
if(flag[root]==0) //表示没有经过,也没有完整的数
flag[root]=-1; //表示经过这里
root=tree[root][id];
}
if(flag[root]!=0)
return false;
flag[root]=1;
return true;
}
int main()
{
int t, n, f=1;
char buf[15];
scanf("%d", &t);
while(t--)
{
memset(tree, 0, sizeof(tree));
memset(flag, 0, sizeof(flag));
scanf("%d",&n);
f=1;
tot=0;
while(n--)
{
scanf("%s", buf);
if(f)
{
if(insert(buf)==false)//如果这个号码插入过程中,发现前缀是另一个号码,那么就可以令f=0
f=0;//后续的字符串就不用进行插入了。
}
}
if(f==1)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
暴力
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
string s[100005];
int main()
{
char p[12];
int t,flag=0,n,i,j;
scanf("%d",&t);
while(t--)
{
flag=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",&p);
s[i]=p;
}
sort(s,s+n);
for(int i=1;i<n;i++)
{
cout<<s[i-1]<<endl;
if(s[i].size()>s[i-1].size())//如果当前的字符串比前一个还要短的话,那么当前的字符串肯定不受影响
{
for(j=0;j<s[i-1].size();j++)
if(s[i][j]!=s[i-1][j])
break;
if(j==s[i-1].size())
{
flag=1;
break;
}
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}
最新文章
- java字符乱码
- HDU 5742 Chess SG函数博弈
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2)
- 一个基于.NET平台的自动化/压力测试系统设计简述
- 【转载】Gambit使用教程
- Android开发框架androidannotations的使用
- 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件
- JS中的apply,call,bind深入理解
- python 3.5 格式化字符串输出
- unity3d游戏开发学习之使用3dmax创建导弹模型
- php的laravel框架使用心得
- 解决jsp中编辑和删除时候弹出框闪退的问题。
- node版本升级参考
- 2017-12-14python全栈9期第一天第四节之python分类
- Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术
- 001.Kubernetes简介
- cdnbest区域自定义配置里添加防xss攻击配置
- 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
- poj 2187:Beauty Contest(旋转卡壳)
- 一些常用的CDN列表
热门文章
- 【NOIP2016提高组复赛day2】天天爱跑步
- java——AtomicInteger 中 incrementAndGet与getAndIncrement 两个方法的区别
- input框与img在同一行对齐
- macOS 更新 git 命令提示 xcrun,.gitignore 配置不生效问题。
- Tomcat配置多域名 Alias
- Hashtable 和 HashMap 的区别是:
- Python爬取中文页面的时候出现的乱码问题(续)
- gitblit 数据迁移(复制)
- 【后台管理系统】—— Ant Design Pro页面相关(二)
- 一、基础篇--1.1Java基础-自定义注解的场景及实现