Trie树:高效存储和查找字符串集合的数据结构
#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; //p指向根节点0
for(int i = 0;str[i];i ++ )
{
int u = str[i] - 'a'; //把每个字母映射成数字
if(!son[p][u])
{ //如果不存在该字母
son[p][u] = ++idx ; //在trie树中创建该点,注意是++idx而不是idx++
}
p = son[p][u]; //p指向该字母son[p][u]
}
cnt[p] ++ ; //p节点处cnt+1,代表有一个单词以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;
cin >> n;
while(n -- )
{
char op[2];
cin >> op >> str;
if(op[0] == 'I')
{
insert(str);
}
else
{
cout << query(str) << endl;
}
}
return 0;
}