輸入樣例:
5 I abc Q abc Q ab I ab Q ab
輸出樣例:
1 0 1
地址 https://www.acwing.com/problem/content/description/837/ios
維護一個字符串集合,支持兩種操做:web
共有N個操做,輸入的字符串總長度不超過 105105,字符串僅包含小寫英文字母。ui
第一行包含整數N,表示操做數。spa
接下來N行,每行包含一個操做指令,指令爲」I x」或」Q x」中的一種。code
對於每一個詢問指令」Q x」,都要輸出一個整數做爲結果,表示x在集合中出現的次數。xml
每一個結果佔一行。blog
1≤N≤2∗104ip
輸入樣例: 5 I abc Q abc Q ab I ab Q ab 輸出樣例: 1 0 1
trie 樹的模板題ci
解法1 使用trie樹解決rem
#include <iostream> using namespace std; const int N = 100010; int son[N][26], cnt[N], idx; char str[N]; void insert(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) son[p][u] = ++ idx; p = son[p][u]; } cnt[p] ++ ; } int query(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) return 0; p = son[p][u]; } return cnt[p]; } int main() { int n; scanf("%d", &n); while (n -- ) { char op[2]; scanf("%s%s", op, str); if (*op == 'I') insert(str); else printf("%d\n", query(str)); } return 0; }
解法2 使用哈希解決
#include <iostream> #include <map> #include <string> using namespace std; map<string,int> re; const int N = 100010; int son[N][26], cnt[N], idx; char str[N]; void insert(char str[]){ re[str]++; } int query(char str[]){ return re[str]; } int main() { int n; scanf("%d", &n); while (n -- ) { char op[2]; scanf("%s%s", op, str); if (*op == 'I') insert(str); else printf("%d\n", query(str)); } return 0; }
5 I abc Q abc Q ab I ab Q ab
1 0 1