AcWing 835. Trie字符串统计
原题链接
简单
作者:
自由周某
,
2020-08-03 16:58:59
,
所有人可见
,
阅读 377
#include<iostream>
using namespace std;
const int N = 2e4 + 5;
int s[N][26];//N表示节点总数,26表示每个节点最多有26个孩子
int cnt[N], id;
void insert(string str){
int p = 0;
for(int i = 0; str[i]; i++){
int u = str[i] - 'a';
if(s[p][u]) p = s[p][u];//如果此根节点存在u儿子,那么p就走到儿子那里去
else {s[p][u] = ++id; p = s[p][u];} //如果不存在u这个儿子,就创建且赋予id,然后p也走到新儿子那里
}
cnt[p]++;
}
int query(string str){
int p = 0;
for(int i = 0; str[i]; i++){
int u = str[i] - 'a';
if(s[p][u]) p = s[p][u];//如果p这个节点存在u这个儿子,那么p就走到儿子那里去
else return 0;//否则说明不存在,直接返回
}
return cnt[p];
}
int main(){
int n;
cin>>n;
while(n --){
char x;
string ss;
cin >> x >> ss;
if(x == 'I')insert(ss);
else cout<<query(ss)<<endl;
}
return 0;
}