Trie算法模板题
代码及注释
#include<iostream>
using namespace std;
const int N = 100010;
int n;
//son -> 所有的子节点,26对应题目出现的26个英文字母
//cnt -> 字符串出现的次数
//idx -> 当前可用的下标 idx == 0时可能时根节点也可能是空结点
int son[N][26],cnt[N],idx;
//插入操作
void ins(char str[]){
int q = 0; //相当于一个指针
for(int i = 0;str[i];i ++){
int u = str[i] - 'a'; //转换成下标
//一定要注意是 ++ idx 不然从在0会多次开辟节点
if(!son[q][u]) son[q][u] = ++ idx; //如果子节点没东西,赋值
q = son[q][u]; //移动指针
}
cnt[q] ++; //该字符串出现次数加一
}
//求出现次数
int query(char str[]){
int q = 0;
for(int i = 0;str[i];i ++){
int u = str[i] - 'a'; //转换成下标
if(!son[q][u]) return 0; //不存在该单词
q = son[q][u]; //移动指针
}
return cnt[q]; //返回字符串出现的次数
}
int main(){
cin >> n;
while(n --){
char op[2],str[N];
scanf("%s%s",op,str);
if(op[0] == 'I') ins(str);
else cout << query(str) << endl;
}
return 0;
}