UVa 644 Immediate Decodability

水题一道.但是还是花了不少时间.

不过总比前几次没做出来好.

看来前几天做的题还是有点效果的╮(╯▽╰)╭

题目的意思就是判断是否存在一个字符串是另一个字符串的前缀.

一开始我在前缀这里纠结了好久..

如果在中间相同算前缀吗...

后来再仔细想了想...好吧..应该是不算的.

第一次的时候没考虑输入的问题,天真地认为长度都是一个比一个长的..然后就悲剧了

比如

1111

11

按照我第一次的算法结果是没有可以作为前缀的..

于是我又加了qsort.

可是现在一看..如果把每组数都从头开始比较也是可以的..但是WA了..奇怪..晚上再看看.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp_string(const void *_a, const void *_b)
{
    char *a = (char *) _a;
    char *b = (char *) _b;
    return (strlen(a) - strlen(b));
}
int main()
{
    //freopen("input.txt","r",stdin);
    int count = 1;
    char word[10][20];
    char buf[20];
    int i = 0, j = 0,k = 0;
    bool flag = false;
    bool start = false;
    memset(word,0,sizeof(word));
    memset(buf,0,sizeof(buf));
    while (scanf("%s",word[i++]) == 1)
    {
        if (word[i - 1][0] == '9')      //如果字符串是9,开启搜索模式
            start = true;
        if (start)
        {
            qsort(word,i - 1,sizeof(word[0]),cmp_string);       //按字符串长度从小到大排序
            for (int l = 0; l < i - 1; l++)
            {
                int len = strlen(word[l]);
                strcpy(buf,word[l]);        //先把第l个字符串存入buf
                for (j = l; j < i - 1; j++)     //接下来类似于冒泡法,分别和另外的几个字符串对比.
                {
                    for (k = 0;k < len; k++)        //只需搜索word[l]的长度.
                    {
                        if (buf[k] != word[j + 1][k])
                            break;
                        if (buf[k] == word[j + 1][k])
                        {
                            if (k == len - 1)       //完全相同的时候,开启flag
                            {
                                flag = true;
                                break;
                            }
                        }
                    }
                }
            }
            if (flag)
                printf("Set %d is not immediately decodable\n", count++);
            else
                printf("Set %d is immediately decodable\n", count++);
            memset(word,0,sizeof(word));
            memset(buf,0,sizeof(buf));
            flag = false;
            start = false;
            i = j = k = 0;
        }
    }
    return 0;
}


刚试了一下,确实可以..╮(╯▽╰)╭


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