欢乐嘣嘣嘣:5687
字典树的添加--查找--删除--
注意:
删除的是所有前缀等于给定字符串的单词。
例如:
插入:
abc
abd
删除
abc
查找
ab=YES
删除
abd
查找
ab=NO
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct trie{
trie * next[26];
int p;
}P[3300000];
int kp;
trie * boot=&P[0];
void insert(char xx[])
{
trie *k=boot;
int j,ll=strlen(xx);
for (int i=0;i<ll;i++)
{
j=xx[i]-'a';
if (!k->next[j])
k->next[j]=&P[kp++];
k=k->next[j];
k->p++;
}
}
int search(char xx[])
{
trie *k=boot;
int j,ll=strlen(xx);
for (int i=0;i<ll;i++)
{
j=xx[i]-'a';
if (!k->next[j])
return false;
k=k->next[j];
}
return true;
}
void dele(char xx[])
{
trie *k=boot;
int j,ll=strlen(xx);
for (int i=0;i<ll;i++)
{
j=xx[i]-'a';
if (!k->next[j])
return ;
k=k->next[j];
}
int pp=k->p;
k=boot;
for (int i=0;i<ll;i++)
{
j=xx[i]-'a';
k->next[j]->p-=pp;
if (k->next[j]->p==0)
{
k->next[j]=NULL;
break;
}
k=k->next[j];
}
}
int main()
{
int n;scanf("%d",&n);
char ch[10],xx[40];kp=1;
while (n--)
{
scanf("%s%s",ch,xx);
if (ch[0]=='i')
insert(xx);
else if (ch[0]=='d')
dele(xx);
else
{
int op=search(xx);
printf("%s\n",op?"Yes":"No");
}
}
return 0;
}
/*
45
insert abc
insert abd
search a
delete abc
search a
delete abd
search a
*/