POJ 1056 IMMEDIATE DECODABILITY

分析:题意很简单,就是判断有没有一串编码是另一串的前缀,这让我想到了赫夫曼编码(比如对于一串字符串含有ABCDEFG,用二进制字符来代表字母,先构造一颗赫夫曼树,从根节点开始走,往左走是0,往右走就1,一直走到叶节点,从根节点到叶节点经过的路径就是一个叶节点字母的二进制字符,因为每个字母都是叶节点,所以不存在一个字符的编码是另一个的前缀)。于是我们用数组来表示满二叉树,如果从根节点到一个节点的路径经过另一个节点,那么就是不可译码。
# include <stdio.h>
# include <string.h>
  int main()
  {
      int i,k,n,t=1,flag=0,a[2500];
      char s[15];
      while(gets(s))
      {
          if(s[0]=='9')
          {
              if(flag==1)
                printf("Set %d is not immediately decodable\n",t++);
              else
                printf("Set %d is immediately decodable\n",t++);
              flag=0;
              memset(a,0,sizeof(a));
              continue;
          }
          n=strlen(s);
          for(i=0,k=1;i<n;i++)
          {
              if(s[i]=='0')
                k=2*k;
              else
                k=2*k+1;
              if(a[k]==1)
                flag=1;
          }
          a[k]=1;
      }
      return 0;
  }

你可能感兴趣的:(ACM,poj)