字典树的插入 删除 查找

来源:互联网 发布:下载炫浪网络社区app 编辑:程序博客网 时间:2024/06/05 09:13

Problem C

 Accepts: 832

 Submissions: 6612

 Time Limit: 2000/1000 MS (Java/Others)

 Memory Limit: 131072/131072 K (Java/Others)

Problem Description

度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:
1、insert : 往神奇字典中插入一个单词

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

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

Input

这里仅有一组测试数据。第一行输入一个正整数N(1≤N≤100000)N (1\leq N\leq 100000)N(1≤N≤100000),代表度熊对于字典的操作次数,接下来NNN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: 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 <cstdio>#include <cstring>#include <iostream>using namespace std;#define maxnode 30struct Node{    char ch;    Node *next[maxnode];    int count;    Node()    {        count = 0;        memset(next, 0, sizeof(next));    }};void Destroy(Node *root){    if (!root) return;    for (int i = 0; i < maxnode; ++i)    {        Destroy(root->next[i]);    }    delete root;}void DestroySon(Node *root){    if (!root) return;    for (int i = 0; i < maxnode; ++i)    {        Destroy(root->next[i]);        root->next[i] = NULL;    }}void Insert(Node *root, char *str){    Node *cur = root;    for (int i = 0; str[i]; ++i)    {        int id = str[i] - 'a';        if (!cur->next[id]) cur->next[id] = new Node;        cur = cur->next[id];        ++cur->count;    }}Node *Search(Node *root, char *str){    Node *cur = root;    for (int i = 0; str[i]; ++i)    {        int id = str[i] - 'a';        if (cur->next[id])            cur = cur->next[id];        else            return NULL;    }    return cur;}void Delete(Node *root, char *str){    Node *cur = Search(root, str);    if (!cur) return;    DestroySon(cur);    Node *pcur = root;    for (int i = 0; str[i]; ++i)    {        int id = str[i] - 'a';        if (pcur->next[id])        {            pcur = pcur->next[id];            pcur->count-= cur->count;        }    }}int main(){    int N;    scanf("%d",&N);    Node *root = new Node;    while(N--){        char op[32],s[32];        scanf("%s%s", op, s);        if(op[0] == 'i')        {            Insert(root, s);        }        else if(op[0] == 'd')        {            Delete(root, s);        }        else        {            Node *tmp = Search(root,s);            if (tmp && tmp->count > 0)            {                printf("Yes\n");            }            else            {                printf("No\n");            }        }    }    return 0;}
0 0
原创粉丝点击