AcWing 835. Trie字符串统计
原题链接
简单
作者:
Winkel
,
2020-10-31 14:40:09
,
所有人可见
,
阅读 352
#include<iostream>
using namespace std;
const int N = 100010;
// son[i][j] = k:第i个结点(0<= i < N)下存放的字母j的结点为k。son[1][0]=2表示结点1的一个值为a的子结点为结点2,结点=0则表示没有该子结点
// cnt[i]:以字母i结尾的字符串的个数
// idx:当前用到的结点编号,每个结点都有一个编号
// son和链表中的ne[]可以类比
int son[N][26], cnt[N], idx;
char str[N];
void insert(char *str)
{
int p = 0; //结点编号,从根结点0开始
for(int i = 0; str[i]; i++)
{
int num = str[i] - 'a'; // 将字母a-z映射为数字0-25
if(!son[p][num]) son[p][num] = ++idx; // 不存在,则创建结点
p = son[p][num];
}
cnt[p]++; //存储的字符串加1
}
int query(char *str)
{
int p = 0;
for(int i = 0; str[i]; i++)
{
int num = str[i] - 'a';
if(!son[p][num]) return 0;
else p = son[p][num];
}
return cnt[p];
}
int main()
{
int n;
cin >> n;
while(n--)
{
char op[2];
scanf("%s%s",op, str);
if(*op == 'I')insert(str);
else cout << query(str) << endl;
}
return 0;
}