链表实现 328MS
#include <stdio.h>
#define N 10
struct Node
{
Node *next[N];
bool vis;//字符串的结束 最后一个字符
void init()
{
vis=0;
for (int i=0;i<N;i++) next[i]=NULL;
}
};
bool build(char *s,Node *root)
{
Node *p=root;
int x;
for (;*s;s++)
{
x=*s-'0';
if (*(s+1)==0 && p->next[x]!=NULL)// 1.当前串 是别的串的子串 只判断一次
{
return 1;
}
if (p->next[x]==NULL)
{
Node *q=new Node;
q->init();
p->next[x]=q;
}
p=p->next[x];
if (p->vis) return 1;// 2.别的串是当前串的子串 每个节点都判断
}
p->vis=1;//当前串的结束节点
return 0;
}
void end(Node *root)//释放内存
{
for (int i=0;i<N;i++)
{
if (root->next[i]!=NULL) end(root->next[i]);
delete root->next[i];
root->next[i]=NULL;
}
}
int main ()
{
//freopen("1671.txt","r",stdin);
int T,n;
bool flag;
char s[15];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
flag=0;
Node *root=new Node;
root->init();
while(n--)
{
scanf("%s",s);
if ( build(s,root) )
{
flag=1;
break;
}
}
while(flag && n--)
{
scanf("%s",s);
}
if (flag) puts("NO");
else puts("YES");
end(root);
}
}
数组实现 62MS
#include <stdio.h>
#include <string.h>
#define N 10
struct Node
{
int child[N];
bool vis;//字符串的结束 最后一个字符
void init()
{
vis=0;
memset(child,-1,sizeof(child));
}
}t[100010];
bool flag;
int idx;
void build(char *s)
{
int x;
int k=0;//current
for (;*s;s++)
{
x=*s-'0';
if (*(s+1)==0 && t[k].child[x]!=-1)// 1.当前串 是别的串的子串 只判断一次
{
flag=0;
return;
}
if (t[k].child[x]==-1)
{
t[k].child[x]=++idx;
t[idx].init();
}
k=t[k].child[x];
if (t[k].vis)// 2.别的串是当前串的子串 每个节点都判断
{
flag=0;
return;
}
}
t[k].vis=1;
}
int main ()
{
//freopen("1671.txt","r",stdin);
int T,n;
char s[15];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
flag=1;
idx=0;
t[0].init();
while(n--)
{
scanf("%s",s);
if (flag) build(s);
}
if (!flag) puts("NO");
else puts("YES");
}
}