hdu 1251(字典树)

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 29183    Accepted Submission(s): 11454


Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

 

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 

 

Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 

 

Sample Input
banana band bee absolute acm ba b band abc
 

 

Sample Output
2 3 1 0
 
 
字典树水题。。主要就是判断java判断空行结束
String str = sc.nextLine();
if(str.length()==0) break;
 
第二个把 sc.hasNext写成了 true ,无限循环错了n多次 。。。
 
import java.util.Scanner;

class Trie {
    private Node root;
    public Trie() {
        root = new Node();
    }
    public void insert(String str){
        Node t = root;
        for(int i=0;i<str.length();i++){
            if(t.nodes[str.charAt(i)-'a']==null){
                Node node = new Node();
                t.nodes[str.charAt(i)-'a'] = node;
            }
            t = t.nodes[str.charAt(i)-'a'];
            t.num++;
        }
    }
    public int find(String str){
        Node t = root;
        for(int i=0;i<str.length();i++){
            if(t.nodes[str.charAt(i)-'a']==null) return 0;
            t = t.nodes[str.charAt(i)-'a'];
        }
        return t.num;
    }
    class Node{
        int num;
        Node []nodes;
        public Node() {
            num= 0;
            nodes = new Node[26];
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Trie tree = new Trie();
        while(true){
            String str = sc.nextLine();
            if(str.length()==0) break;
            tree.insert(str);
        }
        while(sc.hasNext()){
            String str1 = sc.nextLine();
            System.out.println(tree.find(str1));
        }
        
    }
}

 

posted @ 2016-04-02 19:05  樱花庄的龙之介大人  阅读(159)  评论(0编辑  收藏  举报