poj3630
2015-06-12 15:53
281 查看
题目链接:http://poj.org/problem?id=3630
题意:在给出的相应数量的字符串中,如果存在一个字符串是另一个字符串的前缀,就输出“NO“否则输出”YES“。
解题思路:分两种情况:如果字符串A是字符串B的前缀,1是A在B的前面,2是A在B的后面。我在这里只用了trie树的插入,同时将相应字符串的下标存入trie树中,便于判断,第一次将所有的字符串插入,是处理第1种情况,第二次插入是处理第2种情况。
#include<cstdio> #include<cstring> using namespace std; struct trie { int next[10]; int id; }tree[100005]; bool flag; int cnt; char s[10005][15]; void insert(char *t,int id) { int len=strlen(t); int p=0; for(int i=0;i<len;++i) { int x=t[i]-'0'; if(tree[p].next[x]==0) tree[p].next[x]=(cnt++); if((tree[p].id)&&(tree[p].id!=id))//如果这个字符串某个位置不为0,说明在前面的字符串出现过,flag=false; flag=false; p=tree[p].next[x]; } tree[p].id=id; } int main() { int d,n; scanf("%d",&d); while(d--) { flag=true; cnt=1; scanf("%d",&n); memset(tree,0,sizeof(tree)); for(int i=1;i<=n;++i) { scanf("%s",s[i]); insert(s[i],i);//处理第1种情况 } if(flag==false) { printf("NO\n"); continue; } for(int i=1;i<=n;++i) { insert(s[i],i);//处理第2种情况。 if(flag==false) break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- 对宏定义中出现的##运算符和#运算符的说明
- java执行http请求乱码解决
- NSMutableArray 删除元素
- 浅谈JAVA反射机制在Android应用开发中的应用
- 关于spring的介绍
- udp tcp
- WebEssentials 在vs2013 update5安装报错的解决方法.
- ASP.NET验证控件
- linux命令6--cp命令
- Docker Nova Driver实践
- Android设计模式(十二)--抽象工厂模式
- ASP.NET Session
- 第六章:架构篇 Replica Sets复制集的搭建
- C#判断字符串是否只有数字和字母组成(Regex.IsMatch)
- 用户管理
- 数组中出现次数超过一半的数字
- Win7系统应该如何使用打印机来扫描文件
- TPKeyboardAvoidingTableView 的问题
- OSG内存管理——智能指针
- 20大UI设计原则