题目
给定 n n n 个长度不超过 10 10 10 的数字串,问其中是否存在两个数字串 S , T S,T S,T,使得 S S S 是 T T T 的前缀,多组数据。
输入格式
第一行一个整数
T
T
T,表示数据组数。
对于每组数据,第一行一个数
n
n
n,接下来
n
n
n 行输入
n
n
n 个数字串。
输出格式
对于每组数据,若存在两个数字串
S
S
S,
T
T
T,使得
S
S
S 是
T
T
T 的前缀,则输出 NO ,否则输出 YES 。
请注意此处结果与输出的对应关系!
Input
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
Output
NO
YES
代码
#include <iostream>
#include<cstring>
using namespace std;
const int N=1000010;
int son[N][10], idx, en[N];
char s[12];
int insert(){
scanf("%s", s);
int p=0, c=0;
int flag=0;
for(int i=0; s[i]; i++){
int u=s[i]-'0';
if(son[p][u]!=0)c++;
if(!son[p][u]){
son[p][u]=++idx;
}
p=son[p][u];
if(en[p]==-1) flag=1;
}
if(c==strlen(s))flag=1;
en[p]=-1;
if(flag==1)return 1;
else return 0;
}
int main(){
int t, n, k=0;
cin>>t;
while(t--){
k=0
idx=0;
memset(son, 0, sizeof(son));
memset(en, 0, sizeof(en));
scanf("%d", &n);
while(n--){
k+=insert();
}
// for(int i=0; i<10; i++){
// for(int j=0; j<10; j++){
// cout<<son[i][j];
// }
// cout<<endl;
// }
if(k>0)printf("NO\n");
else printf("YES\n");
}
return 0;
}
已经把能犯的错都犯了一遍了orz