IT民工
加油!

  判断编码是否合法。合法的编码不允许出现一个编码是另一个编码的前缀。问题就在判断

是否出现这样的情况。用字典树存储,定义两个标记end0代表当前结点是一个编码的结束,

alr1代表有一个编码经过了这个结点。由字典树的性质,当一个编码结束的结点alr1,那么

代表这个编码是另一个编码的前缀。此外,当一个编码经过的某个结点出现end值为1的情况,说

明有一个编码是当前编码的前缀。

 

/*Accepted    168K    0MS    C++    1044B    2012-08-02 13:05:53*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{
    int next[2];
    int end, alr;
}Trie;
Trie t[1 << 8];
int tp;

int insert(char *x, int site)
{
    if(t[site].end)
        return 1;
    if(*x)
    {
        t[site].alr = 1;
        if(!t[site].next[*x - '0'])
            t[site].next[*x - '0'] = tp ++;
        insert(x + 1, t[site].next[*x - '0']);
    }
    else
    {
        t[site].end = 1;
        return t[site].alr;
    }
}

int main()
{
    int T, n, flag = 0;
    char s[15];
    tp = 1;
    T = 0;
    while(scanf("%s", s)!= EOF)
    {
        if('9' == s[0])
        {
            if(!flag)
                printf("Set %d is immediately decodable\n", ++ T);
            else
                printf("Set %d is not immediately decodable\n", ++ T);
            flag = 0;
            memset(t, 0, sizeof (Trie) * (tp + 1));
            tp = 1;
            continue;
        }
        if(!flag && insert(s, 0))
            flag = 1;
    }
    return 0;
}

 

 

 

posted on 2012-08-02 13:16  找回失去的  阅读(1353)  评论(0编辑  收藏  举报