hdu 5687 裸字典树

来源:互联网 发布:保融软件 编辑:程序博客网 时间:2024/06/03 13:08

度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:

1、insert : 往神奇字典中插入一个单词

2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词

3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
Input
这里仅有一组测试数据。第一行输入一个正整数N(1≤N≤100000)N(1≤N≤100000),代表度熊对于字典的操作次数,接下来NN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。
Output
对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。
Sample Input
5
insert hello
insert hehe
search h
delete he
search hello
Sample Output
Yes
No

#include <bits/stdc++.h>using namespace std;const int MAXN = 3000005;const int CASE_SIZE = 26;struct Trie{    int child[MAXN][CASE_SIZE],value[MAXN],trieN,root;    void init()    {        trieN=root=0;value[root]=0;        memset(child[root],-1,sizeof(child[root]));    }    int newnode()    {        trieN++;value[trieN]=0;        memset(child[trieN],-1,sizeof(child[trieN]));        return trieN;    }    void insert(char *s)    {        int x=root;        for(int i=0;s[i];i++)        {            int d=s[i]-'a';            if(child[x][d]==-1)                child[x][d]=newnode();            x=child[x][d];            value[x]++;        }    }    void del(char *s)    {        int x=root;        for(int i=0;s[i];i++)        {            int d=s[i]-'a';            if(child[x][d]==-1) {                return ;            }            x=child[x][d];        }        int res=value[x];        x=root;        for(int i=0;s[i];i++)        {            int d=s[i]-'a';            if(child[x][d]==-1) {                return ;            }            int pre=x;            x=child[x][d];            value[x]-=res;            if(value[x]==0) child[pre][d]=-1;        }    }    int search(char *s)    {        int x=root;        for(int i=0;s[i];i++)        {            int d=s[i]-'a';            if(child[x][d]==-1)                return 0;            x=child[x][d];        }         if(value[x]) return 1;        return 0;    }}trie;char s[30];char str[30];int main(){    int n;    scanf("%d",&n);    trie.init();    while(n--){        scanf("%s",str);        scanf("%s",s);        if(str[0]=='i') trie.insert(s);        if(str[0]=='d') trie.del(s);        if(str[0]=='s') if(trie.search(s)) cout<<"Yes"<<endl;        else cout<<"No"<<endl;    }}