hdoj-1251统计难题(字典树)

来源:互联网 发布:linux usr local 编辑:程序博客网 时间:2024/06/05 20:31

统计难题

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


Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 

Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 

Sample Input
bananabandbeeabsoluteacmbabbandabc
 

Sample Output
2310
 
题目链接
字典树模板题,但这题也可以用map做,因为只找前缀,所以用map将所有的前缀存起来就好了,下面是两个代码。
#include <stdio.h>#include <string.h>#define MAX 500000using namespace std;int s[MAX][26],count[MAX],tot;void Init(){    memset(s[0],0,sizeof(s[0]));    memset(count,0,sizeof(count));    tot=1;}void Insert(char *c){    int i,j,u,n;    n=strlen(c);    j=0;    for(i=0;i<n;i++)    {        u=c[i]-'a';        if(!s[j][u])        {            memset(s[tot],0,sizeof(s[tot]));            count[tot]=0;            s[j][u]=tot++;        }        j=s[j][u];        count[j]++;    }}int Query(char *c){    int i,j,u,n;    n=strlen(c);    j=0;    if(n>20)        return 0;    for(i=0;i<n;i++)    {        u=c[i]-'a';        if(!s[j][u]) return 0;        if(i+1==n) break;        j=s[j][u];    }    return count[s[j][u]];}int main(){    int ans;    char c[100];    Init();    while(gets(c),c[0]!='\0')    {        Insert(c);    }    while(gets(c))    {        ans=Query(c);        printf("%d\n",ans);    }    return 0;}

#include<iostream>#include<cstring>#include<map>#include<cstdio>using namespace std;int main(){    map<string,int> m;string str;char a;while(1){scanf("%c",&a);if(a=='\n'){scanf("%c",&a);str.clear();}if(a=='\n')            break;str=str+a;m[str]++;}while(cin>>str){cout<<m[str]<<endl;}return 0;}


原创粉丝点击