前缀码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
请编写一个程序,判断输入的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<string.h>
#include<stdlib.h>
typedef struct binode{
int d;
struct binode *lc,*rc;
}bin,*pbin;
int main(){
int n,judge=0,i,l;
char s[100000];
pbin root;
root=(pbin)malloc(sizeof(bin));
root->lc=root->rc=NULL;
root->d=0;
scanf("%d\n",&n);
while(n--)
{
pbin p=root; //每次循环的时候定义一次
memset(s,0,sizeof(s)); //字符0
scanf("%s",s);
l=strlen(s);
for(i=0;i<l;i++)
{
switch(s[i])
{
case '0':
if(p->lc==NULL)
{
p->lc=(pbin)malloc(sizeof(bin));
p=p->lc;
p->lc=p->rc=NULL;
p->d=(i==l-1)?1:0;
}
else
{
if(p->lc->d==1||i==l-1) //此字符串含有已出现字符串||此字符串被已出现字符串包含
{
judge=1;
goto k;
}
else p=p->lc;
}
case '1':
if(p->rc==NULL)
{
p->rc=(pbin)malloc(sizeof(bin));
p=p->rc;
p->lc=p->rc=NULL;
p->d=(i==l-1)?1:0;
}
else
{
if(p->rc->d==1||i==l-1)
{
judge=1;
goto k;
}
else p=p->rc;
}
} //switch
} //for
}
k:(judge==0 )? printf("YES\n"):printf("%s\n",s);
return 0;
}