zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/jhz033/p/5581526.html
Copyright © 2011-2022 走看看