0
点赞
收藏
分享

微信扫一扫

hdoj 5687 2016



欢乐嘣嘣嘣:​​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
*/



举报

相关推荐

0 条评论