POJ3630:
给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据.
输入格式
第一行一个整数 ,表示数据组数。
对于每组数据,第一行一个数 ,接下来 行输入 个数字串。
输出格式
对于每组数据,若存在两个数字串 ,,使得 是 的前缀,则输出 NO ,否则输出 YES 。
请注意此处结果与输出的对应关系!
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
struct node{
int nxt[13];
int id;
}tree[maxn];
int cnt;
char s[10005][15];
int n;
int f;
void Insert(char str[15],int id)
{
int len=strlen(str);
int p=0;
for(int i=0;i<len;i++){
int x=str[i]-'0';
if(tree[p].nxt[x]==0){
tree[p].nxt[x]=(++cnt);
}
if(tree[p].id!=0&&tree[p].id!=id){
f=0;
}
p=tree[p].nxt[x];
}
tree[p].id=id;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(tree,0,sizeof(tree));
f=1;
cnt=0;
for(int i=1;i<=n;i++){
scanf("%s",s[i]);
Insert(s[i],i);
}
if(f==0){
printf("NO\n");continue;
}
for(int i=1;i<=n;i++){
Insert(s[i],i);
if(f==0){
break;
}
}
if(!f){
printf("NO\n");
}
else{
printf("YES\n");
}
}
return 0;
}