前缀码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
请编写一个程序,判断输入的n个由1和0组成的编码是否为前缀码。如果这n个编码是前缀码,则输出"YES”;否则输出第一个与前面编码发生矛盾的编码。
输入:
第1行为n(表示下面有n行编码)
第2~n+1行为n个由0或1组成的编码
输出:判断结果
例如,如果输入:
5
00
01
10
110
111
每一个字符均不是其他字符编码的前缀,所以,输出:YES
再如,如果输入:
5
00
01
10
110
11
编码11与前面的编码110的前缀,所以,输出:11
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct Node{
int flag;
struct Node *lchild;
struct Node *rchild;
}*BiTree, BiNode;
int main(int argc, char const *argv[])
{
int n, len, i;
char str[100000];
int flag = 0;
BiTree root, p;
root = (BiTree)malloc(sizeof(BiNode));
root->flag = 0;
root->lchild = NULL;
root->rchild = NULL;
scanf("%d",&n);
while(n--){
memset(str, 0, sizeof(str));
scanf("%s",str);
len = strlen(str);
p = root;
for(int i = 0; i < len; i++){
if(str[i] == '1'){
if(p->lchild == NULL){
p->lchild = (BiTree)malloc(sizeof(BiNode));
p = p->lchild;
p->lchild = NULL;
p->rchild = NULL;
if(i == len-1)
p->flag = 1;
else
p->flag = 0;
}
else{
if(i == len-1 || p->lchild->flag == 1){
goto end1;
}
else p = p->lchild;
}
}
else{
if(p->rchild == NULL){
p->rchild = (BiTree)malloc(sizeof(BiNode));
p = p->rchild;
p->lchild = NULL;
p->rchild = NULL;
if(i == len-1)
p->flag = 1;
else
p->flag = 0;
}
else{
if(i == len-1 || p->rchild->flag == 1){
goto end1;
}
else p = p->rchild;
}
}
}
}
if(!flag){
printf("YES\n");
return 0;
}
end1: printf("%s\n",str);
return 0;
}