TRIE:就是对词根进行存储的字符串
相同的前缀只会储存一遍,因此可以更高效的储存和查找字符串
此类方法也称为FST
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
char str[N];
int son[N][26],cnt[N],idx;
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;//如果想要储存的字母不存在,则取消\0的状态
p=son[p][u];//p换为下一个节点,继续遍历
}
cnt[p]++;//当前词根的数目加1
}
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[0]=='I') insert(str);
else printf("%d\n",query(str));
}
return 0;
}