HDOJ-1305Immediate Decodability(Trie树入门)

题意:给定一些01序列,判断是否存在某个序列是另外一个序列的前缀。第一次写字母树,没用动态分配内存,代码还需完善。

注意判断在插入序列的时候既要判断当前序列是否为已经存在序列的前缀又要判断已经存在的序列是否为当前序列的前缀。

再写几道题,总结出一个自己的模板吧。

/*
静态内存分配的字典树
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 2


typedef struct Trie
{
    int next[MAXN];
    int cnt;
    bool tail;
};

Trie f[1100];
int  tot=0;


void TrieInit()
{
    f[0].next[0]=1;
    f[0].next[1]=2;
}


//0-->not used,1-->has been used
bool Insert(char *s)
{
    int i,j,k,l,flag;
    l=strlen(s);
    flag=0;
    k=0;//初始的根节点
    for(i=0;i<l;i++)
    {

        if(f[k].next[s[i]-'0']!=0)
        {
            k=f[k].next[s[i]-'0'];
            if(f[k].tail) return 1;
            if(i==l-1)
            {
                flag=f[k].cnt;
                f[k].tail=1;
            }
            f[k].cnt++;
        }
        else
        {
            tot++;
            f[k].next[s[i]-'0']=tot;
            k=tot;
            if(f[k].tail) return 1;
            if(i==l-1)
            {
                flag=f[k].cnt;
                f[k].tail=1;
            }
            f[k].cnt++;
        }
    }
    //if(flag) printf("%s\n",s);
    return flag;
}


int main()
{
    int i,j,k,t,m,n,T,flag;
    char s[12];
    T=0;
    while(gets(s))
    {
        memset(f,0,sizeof(f));
        tot=2;
        flag=1;
        TrieInit();

        if(Insert(s)) flag=0;

        while(gets(s))
        {
            if(strcmp(s,"9")==0) break;
            if(flag)
                if(Insert(s)) flag=0;
        }

        printf("Set %d is ",++T);
        printf(flag?"immediately decodable\n":"not immediately decodable\n");
    }

    return 0;
}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/moringrain/article/details/45601079
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞