题目链接:http://poj.org/problem?id=3630
题意:有N个数字串,问其中是不是有某个串是另一个串的子串,有输出NO,否则输出YES。
注意:该题在构造字典树的时候,不能用malloc函数动态构造,应该将字典树保存在数组中,静态构造,否则将报TLE。
代码:
#include<stdio.h>
#include<string.h>
typedef struct Node{
struct Node *next[15];
int count;
}node;
node a[1000005];
int flag,flag1;
int num;
void Insert(char *str,node *root)
{
int i=0,index;
node *p = root;
flag = 0;
while(str[i])
{
index=str[i]-'0';
if(p->next[index] == NULL)
{
flag = 1;
p->next[index] = &a[num++];
p->next[index]->count=0;
memset(p->next[index]->next,NULL,sizeof(p->next[index]->next));
}
if(p->next[index]->count == 1)
{
flag1 = 1;
return ;
}
p = p->next[index];
i++;
}
p->count = 1;
}
int main()
{
int i;
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
int n;
char str[11];
num =0;
node *root = &a[num++];
root->count=0;
memset(root->next,NULL,sizeof(root->next));
scanf("%d",&n);
getchar();
flag = 1;
flag1 = 0;
for(i=1;i<=n;i++)
{
gets(str);
if(flag == 1 && flag1 == 0)
Insert(str,root);
}
if(flag == 0 || flag1 == 1)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}