给定 n 个长度不超过 10 的数字串,问其中是否存在两个数字串 S,T,使得 S 是 T 的前缀,多组数据。
【输入】
第一行一个整数 T,表示数据组数。
对于每组数据,第一行一个数 n,接下来 n 行输入 n 个数字串。
【输出】
对于每组数据,若存在两个数字串 S,T,使得 S 是 T 的前缀,则输出 NO ,否则输出 YES 。
请注意此处结果与输出的对应关系!
【输入样例】
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
【输出样例】
NO
YES
边存边找
#include <stdio.h>
#include <string.h>
int total = 1;
char s[2000011][10];
int tire[2000011][10];
int vis[3000011];
int insert(char s[], int rt)
{
int t = strlen(s), i, k,f=0;
for (i = 0; i < t; i++)
{
k = s[i] - '0';
if (!tire[rt][k])
tire[rt][k] = ++total;
else if(i==t-1)
f=1;
if(vis[rt])
f=1;
rt = tire[rt][k];
}
vis[rt]=1;
return f;
}
int main()
{
int p;
scanf("%d", &p);
while (p--)
{
memset(vis,0,sizeof(vis));
memset(tire,'\0',sizeof(tire));
memset(s,'\0',sizeof(s));
total = 1;
int n, rt = 1, flog = 0, i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s", s[i]);
if(insert(s[i], 1))
{
flog=1;
}
}
if (flog)
printf("NO\n");
else
printf("YES\n");
}
}