代码实现:
#include <iostream>
using namespace std;
const int N = 100000+10;
//son数组用来构建trie数组,那要注意平时讲课的时候trie数组说要有一个根节点,但其实用代码实现的时候是没有的
//cent数组是用来给单词结尾做标记的
//idx表明当前使用到了几个节点
int son[N][26], cent[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] == 0) son[p][u] = ++idx;
//p指向当前节点
p = son[p][u];
}
//标记当前节点,就是给单词的尾字母做一个标记
cent[p]++;
}
int query(char str[])
{
int p = 0;
for(int i = 0; str[i]; i++)
{
int u = str[i] - 'a';
if(son[p][u] == 0) return 0;
p = son[p][u];
}
//返回当前标记的节点,如果当前节点被标记,返回被标记的次数,如果没有被标记,返回0
return cent[p];
}
int main()
{
int n; cin >> n;
while (n--)
{
char op[2], str[N];
scanf("%s %s", op, str);
if(op[0] == 'I') insert(str);
else printf("%d
", query(str));
}
return 0;
}