辞書ツリー練習POJ 1056


Trieツリーは、文字列の長さn時間以内に既存の集合にすでに存在するか否かを判断できる文字列を提供する.POJ 1056は、プレフィックスコードを判定する問題である.すべての文字列が他の文字列の接頭辞でなければ、直接符号化することができます.
POJ 1056タイトル大意:
   いくつかのバイナリコードをあげます.1つのコードが別の接頭辞であれば、is not immediately decodableを出力し、逆にimmediately decodableを出力します.
サンプル:
Sample Input
01
10
0010
0000
9
01
10
010
0000
9
Sample Output
Set 1 is immediately decodable
Set 2 is not immediately decodable

import java.util.Scanner;
class Trie{
    class Node{//     
        Node nxt[]=new Node[10];//    
        boolean end=false;//                 
        int count=0;//         (  )  
    }

    Node head=null;//       

     void clear(){
       head=new Node();
   }
    boolean insert(String str){//     
        Node p=head;
        for(int i=0;i< str.length();i++){
            p.count++;
            if(p.end) return false;//    
            if(p.nxt[str.charAt(i)-'0']==null)
                p.nxt[str.charAt(i)-'0']=new Node();
            p=p.nxt[str.charAt(i)-'0'];
        }
        p.count++;
        if(p.count>1) return false;//    
        p.end=true;
       return true;
    }
    
}
public class Main {

 
    public static void main(String[] args) {
        Trie tree=new Trie();
        Scanner in=new Scanner(System.in);
        int count=0;
        while(in.hasNext())
        {
             String s = in.next();  
             count++;  
             tree.clear();  
             int  flag=0;
            while (!s.equals("9")) {  
                if(!tree.insert(s)) flag++;  
                s = in.next();  
            }  
           if (flag!=0) {//       ,  
              System.out.println("Set "+count+" is not immediately decodable");                          
            }  
            else {//        ,     
             System.out.println("Set " +count+" is immediately decodable");  
            }  
        }  
    }
}

ソースのダウンロード: