用tire树统计单词前缀个数,在初始化时统计经过该节点的数目,比建好树后在统计子树要高效多了~~
import java.util.*;
class TrieNode{
TrieNode[] next = new TrieNode[26];
int nums = 0;
}
public class Main {
public void build(String s,TrieNode tn){
for(int i = 0;i < s.length();i++)
{
if(tn.next[s.charAt(i) – ‘a’] == null){
tn.next[s.charAt(i) – ‘a’] = new TrieNode();
tn.next[s.charAt(i) – ‘a’].nums = 1;
}
else{
tn.next[s.charAt(i) – ‘a’].nums++;
}
tn = tn.next[s.charAt(i) – ‘a’];
}
}
public int find(String s,TrieNode tn){
for(int i = 0;i < s.length();i++){
if(tn.next[s.charAt(i) – ‘a’] != null){
tn = tn.next[s.charAt(i) – ‘a’];
}
else{
return 0;
}
}
return tn.nums;
}
public static void main(String[]args) {
Scanner sc = new Scanner(System.in);
Main main = new Main();
int m = sc.nextInt();
sc.nextLine();
TrieNode tn = new TrieNode();
TrieNode temp = tn;
String s;
while(m–>0){
s = sc.nextLine();
tn = temp;
main.build(s,tn);
}
int n = sc.nextInt();
sc.nextLine();
ArrayList<Integer> res = new ArrayList<>();
while(n–>0){
s =sc.nextLine();
tn = temp;
res.add(main.find(s, tn));
}
for(int i:res)
System.out.println(i);
}
}