Problem C
涉及到字典树的增删查;
#include <bits/stdc++.h>
using namespace std;
struct Trie{
int cnt;
Trie* next[26];
Trie(){
cnt=0;
for(int i=0; i<26; i++){
next[i]=NULL;
}
}
}root;
void create(char *s){
Trie *p=&root;
int len=strlen(s);
for(int i=0; i<len; i++){
int id=s[i]-'a';
if(p->next[id]==NULL) p->next[id]=new Trie;
p=p->next[id];
p->cnt++;
}
}
/*
void release(Trie *p){
if(p==NULL) return;
for(int i=0; i<26; i++){
if(p->next[i]!=NULL) release(p->next[i]);
}
delete p;
}
*/
void del(char *s, int x){
Trie *p=&root;
int len=strlen(s);
for(int i=0; i<len; i++){
int id=s[i]-'a';
if(p->next[id]==NULL) return;
p=p->next[id];
p->cnt-=x;
}
for(int i=0; i<26; i++) p->next[i]=NULL;
}
int find(char *s){
Trie *p=&root;
int len=strlen(s);
for(int i=0; i<len; i++){
int id=s[i]-'a';
if(p->next[id]==NULL) return 0;
p=p->next[id];
}
return p->cnt;
}
int main(){
int N;
scanf("%d", &N);
char op[10], s[35];
for(int i=0; i<N; i++){
scanf("%s%s", op, s);
if(op[0]=='i') create(s);
else if(op[0]=='s') printf("%s\n", find(s)?"Yes":"No");
else{
if(find(s))
del(s, find(s));
}
}
return 0;
}