1、insert : 往神奇字典中插入一个单词
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
字典树删除操作,按出现的次数,在前缀路径上依次删除,最后的扩展结点清空.
//字典树
#include <iostream>
#include <cstdio>
#include <cstring>
#include <malloc.h>
using namespace std;
const int N=1e5+5;
char oper[10];
char str[35];
const int NODE=N*30;
struct trie
{
int sz;
int ch[NODE][26],val[NODE];
void clear(){
memset(ch[0],0,sizeof(ch[0]));
sz=1;
}
int idx(char c){
return c-'a';
}
void insert(char *s)
{
int u=0;
for(int c,i=0;s[i];++i)
{
c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
val[u]++;
}
}
void del(char *s,int num)
{
int u=0;
for(int c,i=0;s[i];++i)
{
c=idx(s[i]);
u=ch[u][c];
val[u]-=num;
}
memset(ch[u],0,sizeof(ch[u]));
}
int _search(char *t)
{
int u=0;
for(int c,i=0;t[i];++i)
{
c=idx(t[i]);
if(!ch[u][c]) return 0;
u=ch[u][c];
}
return val[u];
}
};
trie Trie;
int main()
{
int i,j;
int n;
while(scanf("%d",&n)==1)
{
Trie.clear();
for(i=0;i<n;++i)
{
scanf("%s%s",oper,str);
getchar();
if(oper[0]=='i') {Trie.insert(str);}
else if(oper[0]=='s'){
int cnt=Trie._search(str);
if(cnt>0) printf("Yes\n");
else printf("No\n");
}
else
{
int cnt=Trie._search(str);
if(cnt>0)
{
Trie.del(str,cnt);
}
}
}
}
return 0;
}