您的位置:首页 > 其它

hdu1305 字典树

2015-07-30 10:50 288 查看
这题我开始想的简单了,WA一次,然后看disscuss里有人说输入时长度从小到大的,然后我信了。然后开始while(1) WA;然后我尝试先放如数组。后来对了;

discuss里面果然不能太相信。

根据出现的次数来判断是否为前缀。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct trie
{
trie *next[2];
int sum;
};
trie *root;
void creattrie()
{
root=(trie*)malloc(sizeof(trie));
for(int i=0;i<2;i++)
{
root->next[i]=NULL;
}
root->sum=0;
}
void insert(char *str)
{
int i,j,cnt=0;
int len=strlen(str);
trie *p=root,*q;
for(i=0;i<len;i++)
{
int id=str[i]-'0';
if(p->next[id]==NULL)
{
q=(trie*)malloc(sizeof(trie));
for(j=0;j<2;j++)
q->next[j]=NULL;
q->sum=0;
p->next[id]=q;
}
p=p->next[id];
p->sum++;
}
}

int query(char *str)
{
int i,j;
int cnt=0;
int len=strlen(str);
trie *p=root;
for(i=0;i<len;i++)
{
int id=str[i]-'0';
p=p->next[id];
}
if(p->sum>1)//判断到该字符串结束时,现在的sum是否超过2,如果是,那就代表后面有以这个为前缀的词
cnt=1;
if(cnt)
return 1;
return 0;
}

int main()
{
int i,j,flag,ff=0,ret,count;
char str[100][30];
while(gets(str[0])!=NULL)
{
if(str[0][0]=='9')break;
count=1;
creattrie();
insert(str[0]);
while(gets(str[count]))
{
if(str[count][0]=='9')break;
insert(str[count]);
count++;
}
flag=0;
for(i=0;i<count;i++)
{
flag=query(str[i]);
if(flag)break;
}
if(flag)printf("Set %d is not immediately decodable\n",++ff);
else printf("Set %d is immediately decodable\n",++ff);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: