POJ 1056 IMMEDIATE DECODABILITY

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

是否出现这样的情况。用字典树存储,定义两个标记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;

}

 

 

 

你可能感兴趣的:(media)