HDU 5687 (字典树)

来源:互联网 发布:联想数据盾牌 编辑:程序博客网 时间:2024/05/21 08:49

Problem C

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


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
 


字典树维护每个节点一下的单词个数就好了。很裸。

#include <cstring>#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;#define maxn 3111111struct node {    int num;    int next[26], fa;}tree[maxn];char op[33], a[33];int root, cnt;void New (int c, int fa) {    tree[c].num = 0;    tree[c].fa = fa;    memset (tree[c].next, -1, sizeof tree[c].next);    return ;}void Insert () {    int l = strlen (a);    int p = root;    for (int i = 0; i < l; i++) {        int id = a[i]-'a';        if (tree[p].next[id] == -1) {            tree[p].next[id] = ++cnt;            New (cnt, p);        }        p = tree[p].next[id];        tree[p].num++;    }    return ;}int Search () {    int l = strlen (a);    int p = root;    for (int i = 0; i < l; i++) {        int id = a[i]-'a';        if (tree[p].next[id] == -1) {            return 0;        }        p = tree[p].next[id];    }    return tree[p].num;}void Delete () {    int l = strlen (a);    int p = root;    for (int i = 0; i < l; i++) {        int id = a[i]-'a';        if (tree[p].next[id] == -1) {            return ;        }        p = tree[p].next[id];    }    int ans = tree[p].num;    while (tree[p].fa != -1) {        tree[p].num -= ans;        p = tree[p].fa;    }    p = root;    for (int i = 0; i < l; i++) {        int id = a[i]-'a';        if (tree[tree[p].next[id]].num == 0) {            tree[p].next[id] = -1;            return ;        }        p = tree[p].next[id];    }    return ;}int main () {    //freopen ("in.txt", "r", stdin);    int n;    scanf ("%d", &n);    root = cnt = 0;    New (root, -1);    while (n--) {        scanf ("%s%s", op, a);        if (op[0] == 'i') {            Insert ();        }        else if (op[0] == 'd') {            Delete ();        }        else if (op[0] == 's') {            int ans = Search ();            printf ("%s\n", ans ? "Yes" : "No");        }    }    return 0;}


0 0
原创粉丝点击