您的位置:首页 > 其它

poj 3630 Phone List

2011-07-22 15:16 302 查看
// 题意: 给一组互不相同的号码,问其中是否有号码是另一号码的前缀

#include <iostream>            // trie树
using namespace std ;
struct Node
{
Node *next[10];        //数字0-9
int vis;    //记录该节点所代表的号码是否有被访问过
}table[100000];
Node *root;
int cur;
void init()
{
root=&table[0];
cur=1;
for(int i=0;i<10;++i)
root->next[i]=NULL;
root->vis=0;    //trie树的根结点不包含信息
}
int prefix(char ch[])    //若出现前缀情况则返回 1
{
Node* p=root;
int tag=1;    //假定存在前缀
for(int i=0;ch[i];++i)
{
int j=ch[i]-'0';
if(p->next[j]==NULL)    //说明不可能存在前缀
{
tag=0;
Node* q=&table[cur++];
for(int k=0;k<10;++k)
q->next[k]=NULL;
q->vis=0;
p->next[j]=q;
}
p=p->next[j];        //继续搜索下去
if(p->vis)        //说明存在前缀
return 1;
}
p->vis=1;
return tag;
}
int main()
{
int cases,n;
cin>>cases;
while(cases--)
{
init();
int suc=1;
char ch[11];
cin>>n;
while(n--)
{
scanf("%s",ch);
if( suc && prefix(ch) )
suc=0;
}
if(suc)
printf("YES\n");
else
printf("NO\n");
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: