您的位置:首页 > 其它

poj_3630 Phone List(Trie树练习)

2016-02-05 23:44 393 查看
【题目】

点击这里

【思路】

基本的Trie树应用,作为回顾练习。判断是否有重号的依据:在建树过程中,找到重复串或者在叶子节点继续插入,当且仅当有重号。

【代码】

#include <stdio.h>
#include <string.h>

typedef struct node
{
char c;
int num;
int child[10];
} triNode;

triNode list[100010];

void newNode(long int t, char ch)
{
list[t].c=ch; list[t].num=0;
}

int main()
{
long int m,y;
scanf("%d",&m);
for (y=0;y<m;y++)
{
long int num=0,n,i,j,p,flag=0;
char s[11];
newNode(num,'0');
scanf("%d",&n);

for (i=0;i<n;i++)
{
scanf("%s",s);
if (flag==0)
{
int sLen=strlen(s);

long int k=0, flag1=0;
for (j=0;j<sLen;j++)
{
if (k>0 && list[k].num==0) {flag=1; break;}

int flag2=0,q=0;
for (q=0;q<list[k].num;q++) if (list[list[k].child[q]].c==s[j]) {flag2=1; break;}

if (flag2==0)
{
for (p=j;p<sLen;p++)
{
list[k].child[list[k].num++]=++num;
newNode(num,s[p]);
k=num;
}
flag1=1;
break;
}
else k=list[k].child[q];
}

if (flag1==0) flag=1;
if (flag==1) printf("NO\n");
}
}
if (flag==0) printf("YES\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: