【HDU - 1251 】統計難題(字典樹,求擁有公共字首的字串數量)
阿新 • • 發佈:2018-11-01
題幹:
Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字串為字首的單詞數量(單詞本身也是自己的字首).
Input
輸入資料的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字串.
注意:本題只有一組測試資料,處理到檔案結束.
Output
對於每個提問,給出以該字串為字首的單詞的數量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 1 0
解題報告:
字典樹模板題,,不解釋了。
AC程式碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; int trie[1000005][26]; int num[1000005]; char str[105]; int tot; void insert(char str[]) { int len = strlen(str),rt = 0; for(int i = 0; i<len; i++) { int cur = str[i]-'a'; if(trie[rt][cur] == 0) trie[rt][cur] = ++tot; rt = trie[rt][cur]; num[rt]++; } } int ask(char str[]) { int len = strlen(str),rt=0; for(int i = 0; i<len; i++) { int cur = str[i] - 'a'; if(trie[rt][cur] == 0) return 0 ; rt = trie[rt][cur]; } return num[rt]; } int main() { while(gets(str)) { if(str[0] == NULL) break; insert(str); } while(gets(str)) { printf("%d\n",ask(str)); } return 0 ; }
解題報告:
題目大意:
總結: