Trie字符串统计(Trie树)
Trie树
Trie:用来高效存储和查找的字符串集合,从根节点开始依次存储字符串的各个字符, 并在最后一个字符中做出标记表示 以此结束是一个字符串。

例题:

测试样例:
5 I abc Q abc Q ab I ab Q ab
预期输出:
1 0 1
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+10;
int son[N][26];//题目只存储小写字母,故一个结点最多有26个边
int cnt[N] ,idx;//cnt[]存储某个节点的标记,表示有多少个以此结尾。idx表示当前下标
char str[N];//每次输入的字符;
void insert(char str[]){
int p=0;
for(int i=0;i<strlen(str);i++)
{
int u =str[i]-'a';
if(!son[p][u]) son[p][u]= ++idx; //这里的P指的是第几个节点,按插入顺序确定的,u表示的是这个节点存储的字符。
p=son[p][u];
}
cnt[p] ++; //循环结束时p表示的节点就是一个字符完成的节点。
}
int query(char str[]){
int p=0;
for(int i=0;i<strlen(str);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];
scanf("%s%s",op,str);
if(op[0]== 'I') insert(str);
else cout<<query(str)<<endl;
}
}

浙公网安备 33010602011771号