• hdu 1251 统计难题


    统计难题

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
    Total Submission(s): 58426    Accepted Submission(s): 20375


    Problem Description
    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
     
    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana 
    band
    bee
    absolute
    acm
     
    ba
    b
    band
    abc
     
    Sample Output
    2
    3
    1
    0
     

    题意

    给n个单词,再给m个字符串,分别求以每个字符串为前缀的单词数。

    分析

    直接字典树,输入输入有点恶心,用gets可以输入。

    ///  author:Kissheart  ///
    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<vector>
    #include<stdlib.h>
    #include<math.h>
    #include<queue>
    #include<deque>
    #include<ctype.h>
    #include<map>
    #include<set>
    #include<stack>
    #include<string>
    #define INF 0x3f3f3f3f
    #define FAST_IO ios::sync_with_stdio(false)
    const double PI = acos(-1.0);
    const double eps = 1e-6;
    const int MAX=500005;
    const int mod=1e9+7;
    typedef long long ll;
    using namespace std;
    #define gcd(a,b) __gcd(a,b)
    inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
    inline ll inv1(ll b){return qpow(b,mod-2);}
    inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
    inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;}
    //freopen( "in.txt" , "r" , stdin );
    //freopen( "data.txt" , "w" , stdout );
    int tot,n;
    int trie[MAX][30];
    int sum[MAX];
    char s[15];
    
    void Insert()
    {
        int len=strlen(s);
        int rt=0;
        for(int i=0;i<len;i++)
        {
            int x=s[i]-'a';
            if(!trie[rt][x])
                trie[rt][x]=++tot;
    
            sum[trie[rt][x]]++;
            rt=trie[rt][x];
        }
    }
    int Find()
    {
        int len=strlen(s);
        int rt=0;
        for(int i=0;i<len;i++)
        {
            int x=s[i]-'a';
            if(!trie[rt][x]) return 0;
            rt=trie[rt][x];
        }
        return sum[rt];
    }
    int main()
    {
        while(gets(s))
        {
            if(strlen(s)==0) break;
            Insert();
        }
    
        while(gets(s))
        {
            //printf("%s
    ",s);
            printf("%d
    ",Find());
        }
        return 0;
    }
    View Code
  • 相关阅读:
    overflow:hidden三个作用
    git提交代码步骤以及创建issue事项
    Vue3.0中setup函数的使用
    样式rpx
    js函数
    数据类型
    进制转换
    事件绑定
    微信小程序基础
    “AI+”改变世界!不同领域的5大人工智能趋势
  • 原文地址:https://www.cnblogs.com/Kissheart/p/9742844.html
Copyright © 2020-2023  润新知