zoukankan      html  css  js  c++  java
  • hdoj--1251--统计难题(字典树)

    统计难题

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


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

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

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

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

    Sample Input
    banana band bee absolute acm ba b band abc
     

    Sample Output
    2 3 1 0



    #include<stdio.h>
    #include<string.h>
    #define MAX 1000000+10
    using namespace std;
    char str[1000],ask[1000];
    int ch[MAX][40];
    int word[MAX];
    int val[MAX];
    int sz;
    void init()
    {
    	sz=1;
    	memset(ch[0],0,sizeof(ch[0]));
    	memset(word,0,sizeof(word));
    }
    void in(char *s)
    {
    	int i,j,l=strlen(s);
    	int u=0;
    	for(i=0;i<l;i++)
    	{
    		int c=s[i]-'a';
    		if(!ch[u][c])
    		{
    			memset(ch[sz],0,sizeof(ch[sz]));
    			val[sz]=0;
    			ch[u][c]=sz++;
    		}
    		u=ch[u][c];
    		word[u]++;
    	}
    	val[sz]++;
    }
    int find(char *s)
    {
    	int i,j,l=strlen(s);
    	int u=0;
    	for(i=0;i<l;i++)
    	{
    		int c=s[i]-'a';
    		if(!ch[u][c])
    		return 0;
    		u=ch[u][c];
    	}
    	return word[u];
    }
    int main()
    {
    	init();
    	while(gets(str),str[0])
    	{
    		in(str);
    	}
    	while(scanf("%s",ask)!=EOF)
    	{
    		printf("%d
    ",find(ask));
    	}
    	return 0;
    }


  • 相关阅读:
    我的vimrc设置
    nginx
    选中
    vscode垂直选中列选中
    lsof
    bashrc和bash_profile
    centos安装tree命令
    linux查看磁盘大小df命令
    linux查看文件夹大小du命令
    git本地推送远程
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273771.html
Copyright © 2011-2022 走看看