1.题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1671
2.参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
int cnt;
node* next[10];
node(){
cnt=0;
memset(next,0,sizeof(next));
}
};
node* root=new node;
void build(char* s){
node* p=root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(!p->next[s[i]-'0'])
p->next[s[i]-'0']=new node;
p=p->next[s[i]-'0'];
p->cnt++;
}
}
int find(char* s){
node* p=root;
int len=strlen(s);
for(int i=0;i<len;i++)
p=p->next[s[i]-'0'];
return p->cnt;
}
void freedom(node* p){
for(int i=0;i<10;i++)
{
if(p->next[i])
freedom(p->next[i]);
}
free(p);
}
int main()
{
int t,n,i;
char str[10001][30];
scanf("%d",&t);
while(t--)
{
root=new node;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
build(str[i]);
}
int flag=0;
for(i=0;i<n;i++)
{
if(find(str[i])!=1) ///一旦有一个访问超过一次就说明不可能
{
flag=0;
break;
}
flag=1;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
freedom(root);
}
return 0;
}