POJ_1056_IMMEDIATE DECODABILITY_Trie树

来源:互联网 发布:db2数据库 编辑:程序博客网 时间:2024/06/04 20:01

又是一道简单的字典树问题。题目意思是给多组由9结尾的二进制数(9不包括在内),分别询问这每一组二进制数中是否存在一个数为另一个数的前缀。若没有,则可以快速解码,若有,则不能快速解码。对于每一组数据输出结果。

如题,二进制的话仅有0和1两个数,字典树就是一棵二叉树,因此判断是否存在前缀只要看是否存在一个数的最末一位还有子节点(判断两个即可)。

然后注意读到9之后要初始化各个数组与参数。

附:trie树函数注释http://blog.csdn.net/NeoDQ/article/details/49593539
(都是裸题啊……)

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N =5005;int tr[N][3],n,t;bool p[N];char s[45];int trie(char w[]){    int loc=0;    for (int i=0;w[i];i++)    {        int x=tr[loc][w[i]-'0'];        if (x==-1)            tr[loc][w[i]-'0']=++t;        loc=tr[loc][w[i]-'0'];    }    return loc;}int main(){    n=1;    t=0;    memset (tr,-1,sizeof(tr));    memset (p,false,sizeof(p));    while (scanf ("%s",s)!=EOF)    {        if (s[0]=='9')        {            bool k=false;            for (int i=1;i<=t;i++)            {                if (p[i])                    if (tr[i][0]!=-1||tr[i][1]!=-1)                    {                        k=true;                        break;                    }            }            if (!k)                 printf("Set %d is immediately decodable\n",n);            else                printf("Set %d is not immediately decodable\n",n);            n++;            memset (tr,-1,sizeof(tr));            memset (p,false,sizeof(p));            t=0;        }        else            p[trie(s)]=true;    }    return 0;}
0 0
原创粉丝点击