HDU

来源:互联网 发布:问卷星软件下载 编辑:程序博客网 时间:2024/06/05 07:36

Problem C

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1794    Accepted Submission(s): 510


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

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

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

  3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
 

Input
这里仅有一组测试数据。第一行输入一个正整数N(1N100000),代表度熊对于字典的操作次数,接下来N行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。
 

Output
对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。
 

Sample Input
5insert helloinsert hehesearch hdelete hesearch hello
 

Sample Output
YesNo
 

Source
2016"百度之星" - 资格赛(Astar Round1)


字典树

#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;class Trie {private:    Trie *next[26];    int vju;public:    Trie() {        vju=0;        for(int i=0; i<26; i++)            next[i]=NULL;    }    void insert(const char *a,int i=0) {        if(!next[a[i]-97]) next[a[i]-97]=new Trie;        if(!a[i+1]) {            next[a[i]-97]->vju=1;            return;        }        next[a[i]-97]->insert(a,i+1);    }    bool Prefix_cmp(const char *a,int i=0) {        if(!next[a[i]-97]) return false;        if(!a[i+1]) return true;        return next[a[i]-97]->Prefix_cmp(a,i+1);    }    void pop(int L,int R=0) {        if(!R) R=L+1;        for(int i=L; i<R; i++)            if(next[i]) {                next[i]->pop(0,26);                delete next[i];                next[i]=NULL;            }    }    bool check_end(const Trie *a) {        for(int i=0; i<26; i++)            if(a->next[i])                return true;        return false;    }    bool pop(const char *a,int i=0) {        if(!i&&!Prefix_cmp(a)) return false;        if(!a[i+1]) {            pop(a[i]-97);            return true;        }        if(next[a[i]-97]->pop(a,i+1)) {            if(next[a[i]-97]->vju||check_end(next[a[i]-97])) return false;            pop(a[i]-97);            return true;        }        return false;    }    void show(int j=0) {        cout<<j<<"___";        for(int i=0; i<26; i++)            if(next[i])                cout<<char(i+97)<<' '<<next[i]->vju;        cout<<endl;        for(int i=0; i<26; i++)            if(next[i])                next[i]->show(j+1);    }};int main() {    int n;    cin>>n;    Trie t;    char a[10],b[36];    while(n--) {        cin>>a>>b;        if(!strcmp(a,"insert"))            t.insert(b);        else if(!strcmp(a,"delete"))            t.pop(b);        else if(t.Prefix_cmp(b))            cout<<"Yes"<<endl;        else cout<<"No"<<endl;         // t.show();    }    return 0;}


原创粉丝点击