前缀码判定

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

请编写一个程序,判断输入的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

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

 

#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;  
}  

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值