题目
解释
- Trie:高效的存储和查找字符串集合的数据结构(字典树)
- 如图所示的字典树结构
- 虽然cnt数组中没有存放任何字符串信息
- 但实际上存放了该种字符串的出现次数(在该字符串末尾下标处读取)
- 例如当存入ABDE和ACDE时(按照树结构从上往下深度读取,再从左往右)
- 读取ABDE后,CNT[4]=1
- 读取ACDE后,CNT[7]=1
- 则再次访问ABDE时,即访问CNT[4],同理ACDE
图示
代码段
#include<iostream>
using namespace std;
const int N=1e5+10;
int n;
int son[N][26],cnt[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])son[p][u]=++idx;
//如果不存在该节点则创建它并且将他计入线性数组cnt
p=son[p][u];
}
cnt[p]++;
//cnt数组中存放的是线性字符串的长度
//以及每一个字符串在结束处标记的个数
}
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()
{
cin>>n;
char str[26];
while(n--)
{
char op;
cin>>op;
if (op=='I')
{
cin>>str;
insert(str);
}
else
{
cin>>str;
cout<<query(str)<<endl;
}
}
return 0;
}