思想:主要受上一题10815的启发,对每组数据在进行前缀判断时,可以先排序(因为排序后再判断的话,只需要判断相邻的即可),再遍历所有元素,对其与其相邻(后一个)元素进行前缀判断。其中前缀判断是用strncmp的第三个参数指定前n个字符比较。
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp_string(const void* _a, const void* _b);
void imdecode(int n, int k);
char code[10][20];
int main()
{
int i = 0;//每组数据有i个code,即行数
int j = 1;//第j组数据
memset(code, 0, sizeof(code));
while ((scanf("%s", code[i])) != EOF)//注意别忘了写!=EOF,否则意思是scanf成功读入0个值,不是检测到文件结尾。。
{//输入数据以EOF结束
if (code[i][0] == '9')
{//一组数据
//for(int k=0;k<i;++k)
//printf("%d: %s\n",k,code[k]);
imdecode(i, j);
j++;
memset(code, 0, sizeof(code));
i = 0;
}
else
i++;
}//while
return 0;
}
void imdecode(int n, int k)
{
qsort(code, n, sizeof(code[0]), cmp_string);//第三个参数是各元素占用空间大小,是sizeof,不是strlen。。。
bool b = 1;
for (int i = 0; i<n; ++i)
{
if (strncmp(code[i + 1], code[i], strlen(code[i])) == 0)
{
//printf("%d:%s\n%d:%s\n",i+1,code[i+1],i,code[i]);
b = 0;
}
}
if (b)
printf("Set %d is immediately decodable\n", k);
else
printf("Set %d is not immediately decodable\n", k);
}
int cmp_string(const void* _a, const void* _b)
{
char* a = (char*)_a;
char* b = (char*)_b;
return strcmp(a, b);
}