hdu 1251 trie树

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)


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

注意:本题只有一组测试数据,处理到文件结束.
 
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana band bee absolute acm ba b band abc
 
Sample Output
2 3 1 0
 
Author
Ignatius.L
思路:trie树的简单应用,卡re跟mle有点恶心;
#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=4e5+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]++;
    }
}
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];
int main()
{
    int x,y,z,i,t;
    init();
    while(gets(ch))
    {
        insertt(ch);
        if(strlen(ch)==0)
        break;
    }
    while(gets(ch))
    {
        printf("%d
",getans(ch));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jhz033/p/5581201.html