1. 程式人生 > 實用技巧 >142. 字首統計 AcWing

142. 字首統計 AcWing

原題連結

Trie的基本運用

錯誤思路:

將要查詢字首的字串構建字典樹,這樣的結果是每個字串都要重新構建一次樹,並且我們需要預先儲存要匹配字首的單詞,但題目單詞數目沒有講明,所以我們必須將建樹的字串互換.(這樣建樹會導致MLE)

正解思路:

將字首建樹,如果達到一個結點有單詞就+1,如果沒有單詞就跳出

易錯:

我們需要再當前結點的下一節點處看是否有單詞,否則會少計數

可能會有重複單詞

 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 using namespace
std; 5 const int N = 1e6+10; 6 int son[N][28],idx,cnt[N*28]; 7 void insert(string s) 8 { 9 int p = 0; 10 for(int i=0;i<s.size();i++){ 11 int u = s[i]-'a'; 12 if(!son[p][u]) son[p][u] = ++idx; 13 p = son[p][u]; 14 } 15 cnt[p]++; 16 } 17 int query(string t)
18 { 19 int p = 0,ans = 0; 20 for(int i=0;i<t.size();i++){ 21 int u = t[i]-'a'; 22 if(!son[p][u]) break; 23 if(cnt[p]) ans+=cnt[p]; 24 printf("當t[i]==%c,p==%d\n",t[i],p); 25 p = son[p][u]; 26 } 27 return ans; 28 } 29 int main() 30 { 31 int n,m;
32 scanf("%d%d",&n,&m); 33 for(int i=1;i<=n;i++){ 34 string s; 35 cin>>s; 36 insert(s); 37 } 38 for(int i=1;i<=m;i++){ 39 string s; 40 cin>>s; 41 int ans = query(s); 42 printf("%d\n",ans); 43 } 44 45 return 0; 46 }