hdu 1305 还是字典树

#include<cstdio>
#include<iostream>
#include<string>
#include<cstdlib>
#define maxn 2
#include<queue>
using namespace std;
struct Tri
{
    Tri*next[maxn];
    int num;
};
Tri *root;
void buildTri(string ss)//建树的过程是一个动态的过程 动插的过程
{
    Tri *p=root,*q;
    for(int i=0;i<ss.size();i++)
    {
        int id=ss[i]-'0';
        if(p->next[id]==NULL)
        {
            q=(Tri*)malloc(sizeof(Tri));
            q->num=1;
            for(int j=0;j<maxn;j++) q->next[j]=NULL;
            p->next[id]=q;
            p=p->next[id];
        }
        else p=p->next[id],p->num++;
    }
    p->num=-1;// 作为结束的标志
}
int findTri(string ss)
{
    Tri *p=root,*q;
    for(int i=0;i<ss.size();i++)
    {
        int id=ss[i]-'0';
        p=p->next[id];
        if(p==NULL) return 0;
        if(p->num==-1) return -1;
    }
    return -1;
}
void del(Tri *root)
{
    Tri *zz=root;
    if(zz==NULL) return;
    for(int i=0;i<maxn;i++)
    {
        if(zz->next[i]!=NULL) del(zz->next[i]);
    }
    free(zz);
}
int main()
{
    int Case=0;
    string ss;
    queue<string> fuck;
    while(cin>>ss)
    {
        if(ss=="9")
        {
            int flag=1;
            root=(Tri *)malloc(sizeof(Tri));
            for(int i=0;i<maxn;i++) root->next[i]=NULL;
            root->num=1;
            while(!fuck.empty())
            {
                string temp;
                temp=fuck.front();
                fuck.pop();
                if(findTri(temp)==-1)
                {
                    flag=0;
                    break;
                }
                buildTri(temp);
            }
            if(flag) printf("Set %d is immediately decodable\n",++Case);
            else printf("Set %d is not immediately decodable\n",++Case);
            del(root);
            continue;
        }
        fuck.push(ss);
    }
    return 0;
}
posted @ 2016-10-18 16:18  猪突猛进!!!  阅读(117)  评论(0编辑  收藏  举报