142. 字首統計 AcWing
阿新 • • 發佈:2021-01-01
Trie的基本運用
錯誤思路:
將要查詢字首的字串構建字典樹,這樣的結果是每個字串都要重新構建一次樹,並且我們需要預先儲存要匹配字首的單詞,但題目單詞數目沒有講明,所以我們必須將建樹的字串互換.(這樣建樹會導致MLE)
正解思路:
將字首建樹,如果達到一個結點有單詞就+1,如果沒有單詞就跳出
易錯:
我們需要再當前結點的下一節點處看是否有單詞,否則會少計數
可能會有重複單詞
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 using namespacestd; 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 }