Immediate Decodability HDU - 1305(模板trie)

求这些01串是否有一个是另一个的前缀。。

就是求次数就好了嘛。。。emm。。。

网上竟然都用指针写。。。。

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define maxn 2000010
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
int tot, n, m, rt;
int trie[maxn][2], sum[400001];
char str[1010][1010];
//bool vis[maxn];查询整个单词用
void build(char *s)
{
    int len = strlen(s);
    rt = 0;
    for(int i=0; i<len; i++)
    {
        int x=s[i]-'0';
        if(trie[rt][x]==0)//现在插入的字母在之前同一节点处未出现过
        {
            trie[rt][x]=++tot;//字母插入一个新的位置,否则不做处理
        }
        sum[trie[rt][x]]++;    //前缀后移一个位置保存前缀出现的次数
        rt=trie[rt][x];//为下个字母的插入做准备
    }
    /*vis[rt]=true;标志该单词末位字母的尾结点,在查询整个单词时用到*/
}
int qp(char *s)
{
    int len = strlen(s);
    rt = 0;
    for(int i=0; i<len; i++)
    {
        int x=s[i]-'0';
        if(trie[rt][x]==0)return 0;//以rt为头结点的x字母不存在,返回0
        rt=trie[rt][x];//为查询下个字母做准备
    }
   // cout<< sum[rt] <<endl;
    return sum[rt];
    //查询整个单词时,应该return vis[rt] , 查询前缀出现的次数时,应该return sum[rt]
}

void init()
{
    tot = 0;
    mem(trie, 0);
    mem(sum, 0);
}

int main()
{
    init();
    int kase = 1, cnt = 0;
    while(scanf("%s",str[++cnt])!=EOF)
    {
        if(strcmp(str[cnt],"9")==0){
            bool flag=true;
            for(int i=1;i<cnt;i++){
              //  cout<< temp <<endl;
                if(qp(str[i])>1)
                {
                    flag=false;
                    break;
                }
            }
          //  cout << flag <<endl;
            if(flag)    printf("Set %d is immediately decodable\n",kase++);
            else        printf("Set %d is not immediately decodable\n",kase++);

            init();
            cnt = 0;
            continue;
        }
        build(str[cnt]);
    }
    return 0;
}

 

posted @ 2018-08-10 19:11  WTSRUVF  阅读(151)  评论(0编辑  收藏  举报