• hdu 5687 Problem C trie树


    Problem C

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

    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
    思路:删除的时候,sum-=getans(ch),将最后的那个标记改成0;
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<set>
    #include<map>
    using namespace std;
    #define ll long long
    #define mod 1000000007
    #define pi (4*atan(1.0))
    const int N=5e5+10,M=5e6+10,inf=1e9+10;
    int a[N][27],sum[M],len;
    void init()
    {
        memset(a,0,sizeof(a));
        memset(sum,0,sizeof(sum));
        len=1;
    }
    int getnum(char a)
    {
        return a-'a';
    }
    void insertt(char *aa)
    {
        int u=0,n=strlen(aa);
        for(int i=0; i<n; i++)
        {
            int num=getnum(aa[i]);
            if(!a[u][num])
            {
                a[u][num]=len++;
            }
            u=a[u][num];
            sum[u]++;
        }
    }
    void deletee(char *aa,int pa)
    {
        int u=0,n=strlen(aa),num,gg;
        for(int i=0;i<n;i++)
        {
            num=getnum(aa[i]);
            if(!a[u][num])
            return;
            gg=u;
            u=a[u][num];
            sum[u]-=pa;
        }
        a[gg][num]=0;
        sum[u]-=pa;
    }
    int getans(char *aa)
    {
        int u=0,x=strlen(aa);
        for(int i=0; i<x; i++)
        {
            int num=getnum(aa[i]);
            if(!a[u][num])
            return 0;
            u=a[u][num];
        }
        return sum[u];
    }
    char ch[100],gg[100];
    int main()
    {
        int x,y,z,i,t;
        init();
        scanf("%d",&x);
        for(i=0;i<x;i++)
        {
            scanf("%s%s",gg,ch);
            if(gg[0]=='i')
            insertt(ch);
            else if(gg[0]=='s')
            {
                if(getans(ch))
                printf("Yes
    ");
                else
                printf("No
    ");
            }
            else
            {
                deletee(ch,getans(ch));
            }
        }
        return 0;
    }
  • 相关阅读:
    常见makefile写法
    CMake入门指南
    CMAKE的使用
    Google NewSQL之Spanner
    Google Spanner (中文版)
    全球级的分布式数据库 Google Spanner原理
    idea刷新项目、清除项目缓存
    彻底理解Java的Future模式
    Elasticsearch 三种分页方式
    ElasticSearch 深度分页解决方案
  • 原文地址:https://www.cnblogs.com/jhz033/p/5581526.html
Copyright © 2020-2023  润新知