快速存储和查找字符串集合
存储:结尾要进行标记
查找:要找到结尾的标记
#include <iostream>
using namespace std;
const int N=10e5+10;
char str[N];
int son[N][26], cnt[N], idx;
//每个节点所有儿子/以x结尾的点有多少个/当前用到的下标
void insert(char str[]){
int p=0;
for (int i = 0; str[i];i++){
int u=str[i]-'a';//把a-z映射到0-25
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';//把a-z映射到0-25
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;
}