16. 前缀码判定

16. 前缀码判定

成绩 10 开启时间 2014年11月23日 Sunday 15:40
折扣 0.8 折扣时间 2014年12月7日 Sunday 23:55
允许迟交 关闭时间 2014年12月14日 Sunday 23:55

前缀码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。

请编写一个程序,判断输入的n个由10组成的编码是否为前缀码。如果这n个编码是前缀码,则输出"YES”;否则输出第一个与前面编码发生矛盾的编码。

输入:
1行为n(表示下面有n行编码)
2n+1行为n个由01组成的编码

输出:判断结果


例如,如果输入:

5

00

01

10

110

111

每一个字符均不是其他字符编码的前缀,所以,输出:YES

再如,如果输入:

5

00

01

10

110

11

编码11与前面的编码110的前缀,所以,输出:11

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 5↵
  2. 00↵
  3. 01↵
  4. 10↵
  5. 110↵
  6. 111↵
以文本方式显示
  1. YES↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 5↵
  2. 00↵
  3. 01↵
  4. 10↵
  5. 110↵
  6. 11↵
以文本方式显示
  1. 11↵
1秒 64M 0
测试用例 3 以文本方式显示
  1. 5↵
  2. 00↵
  3. 01↵
  4. 10↵
  5. 11↵
  6. 111↵
以文本方式显示
  1. 111↵
1秒 64M 0
测试用例 4 以文本方式显示
  1. 5↵
  2. 111↵
  3. 110↵
  4. 10↵
  5. 01↵
  6. 00↵
以文本方式显示
  1. YES↵
1秒 64M 0
测试用例 5 以文本方式显示
  1. 8↵
  2. 00↵
  3. 010↵
  4. 0110↵
  5. 0111↵
  6. 10↵
  7. 110↵
  8. 1110↵
  9. 1111↵
以文本方式显示
  1. YES↵
1秒 64M 0
测试用例 6 以文本方式显示
  1. 8↵
  2. 00↵
  3. 010↵
  4. 0110↵
  5. 0111↵
  6. 10↵
  7. 11↵
  8. 1110↵
  9. 111↵
以文本方式显示
  1. 1110↵
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;
}

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值