hdu 1305 Immediate Decodability 字典树

来源:互联网 发布:js获取下一天的日期 编辑:程序博客网 时间:2024/05/29 16:16

字典树统计字符串个数

题意:给你一些字母的编码,全部为01串,让你判断一个01串是不是另外一个01串的前缀。

思路:把01全部存入字典树里面,在依次查找这些字符串,如果这个字符串出现的次数大于等于两次,就不可以快速解码了

详情见代码:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define maxn 100010int cur=1;char str[maxn][12];int vis[maxn];struct node{    int num;    int next[4];    void init()    {        num=0;        memset(next,-1,sizeof(next));    }} trie[maxn];void insert(char *s,int len){    int p=0;    for(int i=0; i<len; i++)    {        int x=s[i]-'0';        if(trie[p].next[x]==-1)        {            trie[cur].init();            trie[p].next[x]=cur++;        }        p=trie[p].next[x];        trie[p].num++;    }}bool find(char *s,int len){    int p=0;    for(int i=0; i<len; i++)    {        int x=s[i]-'0';        p=trie[p].next[x];    }    if(trie[p].num>=2)return false;//01串是另外一个01串的前缀    else return true;}int main(){    int ans=0;    char ss[12];    cur=1;    trie[0].init();    int n=0,len;    while(~scanf("%ss",ss))    {        // cur=1;        if(strcmp(ss,"9")==0)break;        strcpy(str[n],ss);        len=strlen(str[n]);        str[n][len]='\0';        vis[n]=len;        insert(str[n],len);        n++;        for(;;)        {            scanf("%s",str[n]);            if(strcmp(str[n],"9")==0)break;            len=strlen(str[n]);            vis[n]=len;            insert(str[n],len);            n++;        }        bool flag;        for(int i=0; i<n; i++)        {            flag=find(str[i],vis[i]);            if(!flag)break;        }        if(flag)printf("Set %d is immediately decodable\n",++ans);        else printf("Set %d is not immediately decodable\n",++ans);        cur=1;        trie[0].init();        n=0;    }    return 0;}


0 0