题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671
思路:要保证号码可行,对于每一个号码,必须有新建的节点,表明其不被其他号码包含,并且在其结束之前不能到达有结束标记的节点,保证其不包含其他号码。
#include<cstdio>
#include<cstring>
using namespace std;
const int num=100005;
int tel[num][10],val[num],e;
char s[11];
int main()
{
int i,cas,n,len,j,c,f1,f2,u,ans;
//freopen("in.txt","r",stdin);
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
memset(tel,0,sizeof(tel));
memset(val,0,sizeof(val));
e=1;ans=0;
for(i=0;i<n;i++)
{
scanf("%s",s);
f1=1;f2=0;
if(ans) continue;
len=strlen(s);
u=0;
for(j=0;j<len;j++)
{
c=s[j]-'0';
if(tel[u][c]==0)
{
tel[u][c]=e++; //必须建立新的节点
f2=1;
}
if(tel[u][c]&&val[tel[u][c]])
f1=0; //包含有其他的号码
u=tel[u][c];
}
val[u]=1;
if(f1&&f2)
continue;
else
ans=1;
}
if(!ans)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}