Trie树,用来快速存储和查找字符串集合的一个数据结构
#include<iostream>
using namespace std;
const int N = 20010;
int son[N][26]; //记录i号节点的儿子,因为这个题输入都是小写字符串,所以最多有26个儿子
//比如让字符 b - 'a'就映射到了0-25的整数范围之内了
int cnt[N]; //表示以N号节点结尾的单词被插入了多少次
int idx = 1; //表示构造的树的节点的数量,也是可以使用的数组位置的起始下标
void insert(char str[])
{
int parent = 0; //0号节点代表根节点
for(int i=0;str[i];i++) //c++里面字符串结尾是 '\0'是个int型,值就是0
{
if(son[parent][str[i]-'a']==0){
son[parent][str[i]-'a'] = idx;
idx++;
parent = son[parent][str[i]-'a']; //parent更新为当前这个节点的节点号
}
else{
parent = son[parent][str[i]-'a']; //parent更新为当前这个节点的节点号
}
if(str[i+1]=='\0') cnt[parent]++;
}
}
int query(char str[])
{
int parent = 0;
for(int i=0;str[i];i++)
{
if(son[parent][str[i]-'a']){
parent = son[parent][str[i]-'a'];
}
else{
return 0;
}
}
return cnt[parent];
}
int main()
{
int N;
cin>>N;
while(N--)
{
string op;
char str[N];
cin >> op >> str;
int num;
if(op=="I") insert(str);
if(op=="Q") cout<<query(str)<<endl;
}
return 0;
}