Fork me on GitHub

Uva 644 - Immediate Decodability

Immediate Decodability 

An encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will assume for this problem that all codes are in binary, that no two codes within a set of codes are the same, that each code has at least one bit and no more than ten bits, and that each set has at least two codes and no more than eight.

 


Examples: Assume an alphabet that has symbols {A, B, C, D}

 


The following code is immediately decodable:

 


A:01 B:10 C:0010 D:0000

 


but this one is not:

 


A:01 B:10 C:010 D:0000 (Note that A is a prefix of C)

 

Input 

Write a program that accepts as input a series of groups of records from a data file. Each record in a group contains a collection of zeroes and ones representing a binary code for a different symbol. Each group is followed by a single separator record containing a single 9; the separator records are not part of the group. Each group is independent of other groups; the codes in one group are not related to codes in any other group (that is, each group is to be processed independently).

 

Output 

For each group, your program should determine whether the codes in that group are immediately decodable, and should print a single output line giving the group number and stating whether the group is, or is not, immediately decodable.

 


The Sample Input describes the examples above.

 

Sample Input 

 

01
10
0010
0000
9
01
10
010
0000
9

 

Sample Output 

Set 1 is immediately decodable
Set 2 is not immediately decodable

 

 


Miguel A. Revilla 
2000-01-17
 
 
#include<stdio.h>
#include<string.h>

int main()
{
    char set[12][12], temp[12], *str;
    int i, j, flag, t, n = 0, m, cnt = 0;
    memset(set, 0, sizeof(char)*12*12);
    while(scanf("%s", temp) != EOF)
    {
        if(temp[0] == '9')
        {
            cnt++;
            for(i=0; i<n-1; ++i)
            {
                flag = 1;
                for(j=0; j<n-1-i; ++j)
                {
                    if(strlen(set[j]) > strlen(set[j+1]))
                    {strcpy(temp, set[j]); strcpy(set[j],set[j+1]); strcpy(set[j+1], temp); flag = 0;}
                } 
                if(flag) break;
            }
            flag = 0;
            for(i=0; i<n-1; ++i)
            {
                
                for(j=i+1; j<n; ++j)
                {
                    if((str = strstr(set[j], set[i])) != NULL && str - set[j] == 0) 
                    {
                        flag = 1; 
                        break;
                    }
                }
                if(flag) break;
            }
            if(flag) printf("Set %d is not immediately decodable\n", cnt);
            else printf("Set %d is immediately decodable\n", cnt);
            memset(set, 0, sizeof(char)*12*12);
            n = 0;
        }
        else strcpy(set[n++], temp); 
    }
    return 0;
} 

解题报告:

很简单的一道题,一个排序,两个循环,时间复杂度为:O(n^2),但还是有所WA,三四天没做题好像要我的命是的,整天感觉空虚了什么东西,确实,现在做题时感觉稍微有点疏松,第二次WA的原因是因为题目没看清楚,开的数组小了,贡献了一个running error

第一次WA的原因是:

我另外开了一个数组int型的rank[12],打算在调整code的顺序时存储长度从短到长德code的下标数,如下:

 

for(i=0; i<n; ++i) rank[i] = i;
            for(i=0; i<n-1; ++i)
            {
                flag = 1;
                for(j=0; j<n-1-i; ++j)
                {
                    if(strlen(set[j]) > strlen(set[j+1]))  // doc 2
                    {t = rank[j]; rank[j] = rank[j+1]; rank[j+1] = t; flag = 0;} // doc 1
                } 
                if(flag) break;
            }
            flag = 0;
            for(i=0; i<n-1; ++i)
            {
     
                for(j=i+1; j<n; ++j)
                {
                    if((str = strstr(set[rank[j]], set[rank[i]])) != NULL && str - set[rank[j]] == 0)  
                    {
                        flag = 1; 
                        break;
                    }
                }
                if(flag) break;
            }

后来发现是有点不妥,一种情况是这样的:当情况执行到doc1这一步的时候,rank中的一些值有些改变,但再看看doc2这一句,并和rank数组有什么关系,一遍下来对于尽管有执行doc2这行代码,但是丝毫没有影响上面doc1的比较,改变的只是rank[]数组中的数,虽然看上去和我的初衷没什么区别,毕竟体现了我要实现的功能,但是rank里面的数已经乱了套了,所以要更改成:

 

………………………………………………
for
(i=0; i<n-1; ++i) { flag = 1; for(j=0; j<n-1-i; ++j) { if(strlen(set[rank[j]]) > strlen(set[rank[j+1]])) {t = rank[j]; rank[j] = rank[j+1]; rank[j+1] = t; flag = 0;} } if(flag) break; }
…… ………… …… ……

 

posted @ 2012-12-24 21:21  Gifur  阅读(361)  评论(0编辑  收藏  举报
TOP