AcWing 835. Trie字符串统计
原题链接
简单
作者:
满目星河_0
,
2021-03-31 12:28:51
,
所有人可见
,
阅读 145
带注释(超详细)
//算法思想:insert操作就是构建tire树的过程(感觉有点像大数据中的fp-tree),查询操作就是遍历树的过程
//查询过程只不过是只输出节点的值,并不是改变结点的值。
//注:每一个p都是一个节点,p=son[p][u]代表从下面的节点进行查找或插入。
//son[p][u]代表从节点p到达的节点,也就是说son[p][u]是p节点的一个儿子节点。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=100010;
int son[N][26]; //表示每一个节点最多有26个儿子节点
int cnt[N]; //共N个节点,cnt用来记录到当前节点的路径的数量。
int idx;//表示当前使用的数组下标
//存储(插入)操作
void insert(string str){
int p=0;//p=0表示根节点
for(int i=0;str[i];i++){ //遍历要插入的字符串
int u=str[i]-'a'; //将要插入的字符映射到0-25之间
//如果当前节点不存在,就创建一个新的节点
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u]; //如果节点存在,就从这个节点继续往下插入
}
cnt[p]++;
}
//查询操作
int query(string 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 m;
cin>>m;
string a;
char op;
while(m--){
cin>>op;
if(op=='I'){
cin>>a;
insert(a);
}
else{
cin>>a;
cout<<query(a)<<endl;
}
}
return 0;
}