16. 前缀码判定
成绩 | 10 | 开启时间 | 2014年11月23日 Sunday 15:40 |
折扣 | 0.8 | 折扣时间 | 2014年12月7日 Sunday 23:55 |
允许迟交 | 否 | 关闭时间 | 2014年12月14日 Sunday 23:55 |
前缀码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
请编写一个程序,判断输入的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
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 4 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
int flag;
struct Node *lchild;
struct Node *rchild;
}*BiTree,BITree;
int main()
{
int n;
char map[100000];
int flag = 0;
int LEN;
int i;
BiTree Tree;
BiTree p;
Tree = (BiTree)malloc(sizeof(BITree));
Tree->flag = 0;
Tree->lchild = NULL;
Tree->rchild = NULL;
scanf("%d", &n);
while (n--){
memset(map, 0, sizeof(map));
scanf("%s", map);
LEN = strlen(map);
p = Tree;
for (i = 0; i < LEN; i++){
if (map[i] == '1'){
if (p->lchild == NULL){
p->lchild = (BiTree)malloc(sizeof(BITree));
p = p->lchild;
p->lchild = NULL;
p->rchild = NULL;
if (i == LEN - 1)
p->flag = 1;
else
p->flag = 0;
}
else{
if (p->lchild->flag == 1 || i == LEN - 1){
flag = 1;
break;
}
else{
p = p->lchild;
}
}
}
else{
if (p->rchild == NULL){
p->rchild = (BiTree)malloc(sizeof(BITree));
p = p->rchild;
p->lchild = NULL;
p->rchild = NULL;
if (i == LEN - 1)
p->flag = 1;
else
p->flag = 0;
}
else{
if (p->rchild->flag == 1 || i == LEN - 1){
flag = 1;
break;
}
else{
p = p->rchild;
}
}
}
if (flag == 1){
break;
}
}
if (flag == 1)
break;
}
if (flag == 0)
printf("YES\n");
else
printf("%s\n", map);
return 0;
}