1.Tire 字符串统计
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int N=100010;
int son[N][26];//至多 N 层,每一层至多 26 个节点(字母)
int cnt[N];//字符串至多 N 个,标记每个字符串的最后一个字母,
//统计出现次数
int idx;//用到的节点的总数
char str[N];//单次输入的字符串
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';
if(!son[p][u]){
return 0;
}
p=son[p][u];
}
return cnt[p];
}
int main(){
int n;
cin>>n;
while(n--){
char op[2];
cin>>op>>str;
if(op[0]=='I'){
insert(str);
}else{
printf("%d\n",query(str));
}
}
return 0;
}