zoukankan      html  css  js  c++  java
  • trie树---(插入、删除、查询字符串)

    HDU   5687

    Problem Description
    度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:
      1、insert : 往神奇字典中插入一个单词
      2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
      3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
    Input
    这里仅有一组测试数据。第一行输入一个正整数N(1N100000),代表度熊对于字典的操作次数,接下来N行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: 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
    Source
    Recommend
    liuyiding   |   We have carefully selected several similar problems for you:  5689 5688 5686 5685 5684 
     
    思路:使用trie树,在每个节点中加入num标记字符串的个数;
     
    代码如下:
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    typedef struct node{
        int num;
        node *next[30];
        node(){
            memset(next,0,sizeof(next));
            num=0;  ///值得一学的好处理方法 简单实用 初始化节点的漂亮代码
        }
    }Trie;
    char dir[32],s[32];
    void Insert(node *root,char *s){
        node *p=root;
        for(int i=0; s[i]; i++){
            int x=s[i]-'a';
            if(p->next[x]==NULL)
            p->next[x]=new node;
            p=p->next[x];
            p->num++;
        }
    }
    int Search(node *root,char *s)
    {
        node *p=root;
        for(int i=0;s[i];i++)
        {
            int x=s[i]-'a';
            if(p->next[x]==NULL)
            return 0;
            p=p->next[x];
        }
        return p->num;
    }
    void Delete(node *root,char *s,int cnt)
    {
        node *p=root;
        for(int i=0;s[i];i++)
        {
            int x=s[i]-'a';
            p=p->next[x];
            p->num-=cnt;  //删除节点的操作无非就是把当前前缀开头单词数减掉
        }
        for(int i=0;i<30;i++)
        p->next[i]=0;  //再把之后所有的孩子一律杀死(吼吼 好残忍)
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);
        Trie *root=new node;
        while(n--)
        {
            scanf("%s %s",dir,s);
            if(dir[0]=='i')
            {
                Insert(root,s);
            }
            else if(dir[0]=='s')
            {
                if(Search(root,s))
                    printf("Yes
    ");
                else
                    printf("No
    ");
            }
            else
            {
                int cnt=Search(root,s);
                if(cnt) Delete(root,s,cnt);
            }
        }
        return 0;
    }
     
  • 相关阅读:
    Paint类的介绍
    缓存淘汰算法之LRU
    Android SurfaceView实战 打造抽奖转盘
    android中scrollTo和scrollBy的理解
    Android View.onMeasure方法的理解
    Android Context 上下文 你必须知道的一切
    Android Animation简述
    Markdown 语法说明
    理解Java虚拟机体系结构
    Java集合框架:HashMap
  • 原文地址:https://www.cnblogs.com/chen9510/p/5512652.html
Copyright © 2011-2022 走看看