美文网首页
[数据结构]前缀码判定 解题报告

[数据结构]前缀码判定 解题报告

作者: vouv | 来源:发表于2017-03-26 14:28 被阅读0次

    Problem Description

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

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


    测试输入

    5
    00
    01
    10
    110
    111
    

    测试输出

    YES
    

    AcCode

    //
    //  main.cpp
    //  前缀码判定
    //
    //  Created by jetviper on 2017/3/26.
    //  Copyright © 2017年 jetviper. All rights reserved.
    //
    
    #include <stdio.h>
    #include<stdlib.h>
    #include <string.h>
    typedef  struct {
        unsigned  int lchild=0,rchild=0,tail=0;
    }HTNode,*HTT;
    char str[100000];
    HTNode ht[100000];
    int main() {
        // HTT ht;
        int n;
        scanf("%d",&n);
        int i,j,k=2;
        int err =0,now;
        
        for(i =0;i<n;i++){
            
            scanf("%s",str);
            
            if(err==1)continue;
            
            int len = strlen(str);
            
            //start searching
            now = 1;
            
            for(j=0;j<len;j++){
                
                if(ht[now].tail==1){
                    err=1;
                    printf("%s\n",str);
                    break;
                }
                
                
                //if not the last
                
                if(j<len-1){
                    
                    
                    
                    //left
                    if(str[j]=='0'){
                        
                        if(ht[now].lchild==0){
                            ht[now].lchild = k;
                            now = k;
                            k++;
                            continue;
                        }
                        else {
                            now = ht[now].lchild;
                            continue;
                        }
                        
                    }
                    //leftend
                    
                    //right
                    else {
                        
                        if(ht[now].rchild==0){
                            ht[now].rchild = k;
                            now = k;
                            k++;
                            continue;
                        }
                        else {
                            now = ht[now].rchild;
                            continue;
                        }
                        //rightend
                    }
                    
                    
                    
                }
                //else the last
                else {
                    
                    if(str[j]=='0'){
                        
                        if(ht[now].lchild==0){
                            ht[now].lchild = k;
                            ht[k].tail=1;
                            k++;
                            continue;
                        }
                        else {
                            now = ht[now].lchild;
                            if(ht[now].lchild ==0&&ht[now].rchild==0){
                                ht[now].tail = 1 ;
                            }
                            else{
                                err=1;
                                printf("%s\n",str);
                                break;
                                
                            }
                        }
                    }
                    //righttail
                    else {
                        
                        if(ht[now].rchild==0){
                            ht[now].rchild = k;
                            ht[k].tail=1;
                            k++;
                            continue;
                        }
                        else {
                            now = ht[now].rchild;
                            if(ht[now].lchild ==0&&ht[now].rchild==0){
                                ht[now].tail = 1 ;
                                break;
                            }
                            else{
                                err=1;
                                printf("%s\n",str);
                                break;
                                
                            }
                        }
                    }
                }
            }
        }
        if(err==0)printf("YES\n");
        
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:[数据结构]前缀码判定 解题报告

          本文链接:https://www.haomeiwen.com/subject/qnqkottx.html