Trie树
高效的存储和查找字符串集合的数据结构
如图
注意: 需要将一个字符串的结尾做标记,有利于判断数量。
所需数组:
son[N][26]
将各字符节点相连,存每个节点所有子节点
cnt[N]
以当前节点结尾的字符串的数量
例题:
#include <iostream>
using namespace std;
const int N = 100010;
int son[N][26], idx, cnt[N]; //idx记录当前用到哪个 son[i][j]记录i的子节点j的idx
char str[N];
void insert(char str[])
{
int p = 0; //每次插入从根节点开始
for(int i = 0; str[i]; i++)
{
int u = str[i] - 'a';
if(!son[p][u]) son[p][u] = ++idx; //未找见儿子,创建一个即可
p = son[p][u]; //下移(换父)
}
cnt[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];
scanf("%s%s", op, str);
if(op[0] == 'I') insert(str);
else printf("%d\n", query(str));
}
return 0;
}