小Hi和小Ho是一對好朋友,出生在信息化社會的他們對編程產生了莫大的興趣,他們約定好互相幫助,在編程的學習道路上一同前進。java
這一天,他們遇到了一本詞典,因而小Hi就向小Ho提出了那個經典的問題:「小Ho,你能不能對於每個我給出的字符串,都在這個詞典裏面找到以這個字符串開頭的全部單詞呢?」算法
身經百戰的小Ho答道:「怎麼會不能呢!你每給我一個字符串,我就依次遍歷詞典裏的全部單詞,檢查你給個人字符串是否是這個單詞的前綴不就是了?」編程
小Hi笑道:「你啊,仍是太年輕了!~假設這本詞典裏有10萬個單詞,我詢問你一萬次,你得要算到哪年哪月去?」數組
小Ho低頭算了一算,看着那一堆堆的0,頓時感受本身這輩子都要花在上面了...數據結構
小Hi看着小Ho的囧樣,也是繼續笑道:「讓我來提升一下你的知識水平吧~你知道樹這樣一種數據結構麼?」學習
小Ho想了想,說道:「知道~它是一種基礎的數據結構,就像這裏說的同樣!」spa
小Hi滿意的點了點頭,說道:「那你知道我怎麼樣用一棵樹來表示整個詞典麼?」code
小Ho搖搖頭表示本身不清楚。blog
「你看,咱們如今獲得了這樣一棵樹,那麼你看,若是我給你一個字符串ap,你要怎麼找到全部以ap開頭的單詞呢?」小Hi又開始考校小Ho。
「唔...一個個遍歷全部的單詞?」小Ho仍是不忘本身最開始提出來的算法。
「笨!這棵樹難道就白構建了!」小Hi教訓完小Ho,繼續道:「看好了!」
「那麼如今!趕忙去用代碼實現吧!」小Hi如是說道
輸入的第一行爲一個正整數n,表示詞典的大小,其後n行,每一行一個單詞(不保證是英文單詞,也有多是火星文單詞哦),單詞由不超過10個的小寫英文字母組成,可能存在相同的單詞,此時應將其視做不一樣的單詞。接下來的一行爲一個正整數m,表示小Hi詢問的次數,其後m行,每一行一個字符串,該字符串由不超過10個的小寫英文字母組成,表示小Hi的一個詢問。
在20%的數據中n, m<=10,詞典的字母表大小<=2.
在60%的數據中n, m<=1000,詞典的字母表大小<=5.
在100%的數據中n, m<=100000,詞典的字母表大小<=26.
本題按經過的數據量排名哦~
對於小Hi的每個詢問,輸出一個整數Ans,表示詞典中以小Hi給出的字符串爲前綴的單詞的個數。
樣例輸入
5 babaab babbbaaaa abba aaaaabaa babaababb 5 babb baabaaa bab bb bbabbaab
樣例輸出
1 0 3 0 0
import java.util.Scanner; public class Main { static class TrieNode { boolean isWord; int count; TrieNode[] next=new TrieNode[26]; public TrieNode() { isWord = false; count = 0; } } // 插入單詞 public static void insert(String str,TrieNode root) { char[] strArr = str.toCharArray(); TrieNode temp = root; for (int i = 0; i < strArr.length; i++) { if (temp.next[strArr[i] - 'a'] == null) { // 子樹爲空 TrieNode newNode = new TrieNode(); temp.next[strArr[i] - 'a'] = newNode; } temp.count++; temp = temp.next[strArr[i] - 'a']; } temp.isWord=true; } // 檢索單詞的個數 public static int query(String str,TrieNode root) { TrieNode temp=root; char[] strArr=str.toCharArray(); int length=strArr.length; for(int i=0;i<length;i++){ if(temp.next[strArr[i]-'a']==null){ //沒有該索引 return 0; }else temp=temp.next[strArr[i]-'a']; } return temp.count; } public static void main(String[] args) { TrieNode root=new TrieNode(); Scanner scanner=new Scanner(System.in); int[] ans = null; int dataRecordNum=scanner.nextInt(); while(dataRecordNum>=1){ insert(scanner.next(), root); dataRecordNum--; } int testRecordNum=scanner.nextInt(); //保存結果的數組,長度爲testRecordNum ans=new int[testRecordNum]; while(testRecordNum>=1){ ans[5-testRecordNum]=query(scanner.next(), root); testRecordNum--; } for(int i=0;i<ans.length;i++){ System.out.println(ans[i]); } } }