您的位置:首页 > 其它

poj 1056 字典树水题

2012-08-14 15:40 387 查看



刚刚做出来的

昨晚看的模板,第一次看懂了什么是字典树。。汗了,从一开始的结构体定义都不知道。。到现在A过了一题,嘿嘿,挺高兴的

写一下我的理解吧。

主要就是建立一堆一样的结构体,以ROOT为原点,*NEXT【10】为分支联络员,连接着OTHER们,如果输入的S字符串中的数没有建立,那就加一个OTHER【num++】为NEXT【数】的成员,最后再在END上画下true,表示结束。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct shu
{
bool end;                                    //若END为true,说明以前有过这个字符串
shu *next[10];                                               //next为分支联络员
};
shu root,other[10000];                             //建立一堆数OTHER ,root为原点
bool flag=true;                                            //flag为标志,初始为true,若找到重复的了,就标为false
char s[100];
int num=0;
void jianli(char s[])                                               //这个函数来建立各个小分支,并查找他们
{
int len,i;
len=strlen(s);
shu *nowroot=&root;                                        //把原点ROOT给我新建立的NOWROOT  nowroot为当前的分支所在
for(i=0;i<len;i++)                       //开始查找并建立了
{
if(nowroot->next[s[i]-'0']==NULL)                 //这一级若为空,开始建立
{
nowroot->next[s[i]-'0']=&other[num++];                //把OTHER [NUM++]的头地址给当前级的next【当前数】
if(nowroot->end==true)                                           //如果当前级里的END为TRUE ,证明以前有过这个串了
flag=false;                                                             // 把flag赋为false
}
nowroot=nowroot->next[s[i]-'0'];                             //把NOWROOT更新为下一级
}
if(i==len&&nowroot->end==true)                                 //如果当前查找的串有和以前一模一样的
flag=false;                                                                    //flag赋为false
nowroot->end=true;                                                             //for循环完了,把最后一个的下一个分支的END赋为true(现在的nowroot
//为最后一个串的下一级)
for(i=0;i<10;i++)                                                                 //再来个循环看看有没有以前的更长的串,就是我现在的串比以前的短
{
if(nowroot->next[i]!=NULL)                                                //如果不为NULL,就证明有
{
flag=false;                                                                     //flag标为false
break;
}
}
}

int main()
{
int T=1,i;
memset(other,0,sizeof(other));
root.end=false;
for(i=0;i<10;i++)
root.next[i]=NULL;
while(scanf("%s",s)!=EOF)
{
if(strcmp(s,"9")==0)
{
if(flag)                                                                                               //这个if 9 是个初始化
printf("Set %d is immediately decodable\n",T++);
else
printf("Set %d is not immediately decodable\n",T++);
memset(other,0,sizeof(other));
flag=true;
for(i=0;i<10;i++)
root.next[i]=NULL;
root.end=false;
}
else
jianli(s);                                                                            //如果不是9,就建立并查找吧~
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: