hdoj 5687 2016"百度之星" - 资格赛Problem C【字典树--增--删--查】

来源:互联网 发布:qq业务自助下单php源码 编辑:程序博客网 时间:2024/05/19 06:49


欢乐嘣嘣嘣: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; }/*45insert abcinsert abdsearch adelete abcsearch adelete abdsearch a*/


0 0
原创粉丝点击