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

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 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
#include
#include
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;
}

你可能感兴趣的:(BIT数据结构习题)