//问题描述
/*
Description
有很多方法可以实现使用2进制序列对字符进行编码,
比如典型的Huffman编码,
如果在对字符的2进制编码中不存在某一个字符的编码是另一个字符编码的前缀,
那么就称这种编码方式为非前缀编码,Huffman编码就是一种非前缀编码。
比如 A:00 B:10 C:0100 D:0101 则这种编码为非前缀编码;
A:01 B:10 C:010 D:0000,则这种编码为前缀编码。
请写一个程序,判断编码是前缀编码还是非前缀编码。
输入:
第一行是一个整数K,表示有多少个测试用例,以后每行一个测试用例。
每个测试用例为若干个字符串,字符串之间有空格隔开(最大长度不超过1000)。
输出:
每行输出一个测试用例的结果。
如果是非前缀编码输出Yes,否则输出No。
Sample Input
2
01 10 0010 0000
01 10 010 0000
Sample Output
Yes
No
*/
//头文件以及函数申明
#include<stdio.h>
#include<string.h>
#define MAX 1000
int input(char [][MAX]); //处理输入的字符串,将其转换为二维数组,返回二维数组的行数
bool compareTwoPrefixString(char *,char *);
bool judge(char[][MAX],int);
//主函数
int main(void)
{
int cases,row,j,k;//cases表示多少个测试用例,row表示行数,从0开始,row行之际上有row+1行
char array[MAX][MAX];
scanf("%d",&cases);
getchar();
while(cases--)
{
row = input(array);
//printf("%d\n",row);
if(judge(array,row))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
//输入处理
//输入处理
int input(char array[][MAX])
{
int i = 0,j = 0;
char ch;
while((ch = getchar()) != '\n')
{
if(ch != ' ')
{
array[i][j++] = ch;
}
else if(j != 0)
{
array[i++][j] = '\0'; //字符串以'\0'结束
j = 0; //j回到0,转到二维数组的第二行 继续赋值
}
else
{
continue;
}
}
if(j != 0)
{
array[i][j] = '\0';//给最后一个字符串结尾追加'\0'
return i;
}
else
{
//这是输入' '后继续输入'\n'的情况,input is evil!
return i - 1;
}
//while(getchar() != '\n'); //清空缓冲区的多余字符
}
//比较两个字符串,判断其中一个是不是另外一个的前缀
//比较两个字符串,判断其中一个是不是另外一个的前缀
bool compareTwoPrefixString(char *str1,char *str2)
{
/*
int length1 = str1.strlen();
int length2 = str2.strlen();
//取两者的较小者
int length = (length1 > length2)?length2:length1;
//不是字符串,不能这样做
*/
int i = 0;
while(str1[i] != '\0' && str2[i] != '\0')
{
if(str1[i] == str2[i])
{
i++;
continue;
}
else
{
return false;
}
}
return true; //表示违反的前缀编码,即一个字符串是另一个字符串的前缀
}
//判断是不是非前缀编码
//判断是不是非前缀编码
bool judge(char array[][MAX],int row)
{
int i,j;
//行行之间两两比较
for(i=0; i<row; i++)
{
for(j=i+1; j<=row; j++) //为什么要有== 因为在那边返回的时候就是从下标0开始算的行数
{
if(compareTwoPrefixString(array[i],array[j]))
{
return false; //有一个字符串是另外一个字符串的前缀了 所以不满足非前缀编码条件
}
}
}
return true; //是非前缀编码
}
//提交结果:AC
//没有用什么库函数,主要是不熟悉,所以实现起来稍微复杂点。