HDU 1251 统计难题 字典树

G++超内存

G++超内存

G++超内存

统计难题

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


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
 

Recommend
Ignatius.L   |   We have carefully selected several similar problems for you:   1075  1247  1671  1298  1800 
 

ACcode:

 

#pragma warning(disable:4786)//使命名长度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 100005
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI  acos(-1.0)
#define E  exp(1)
#define MAX 26
using namespace std;
struct Trie{
    Trie *next[MAX];
    int v;
};
Trie root;
void createTrie(char *str){
    int len=strlen(str);
    Trie *p=&root,*q;
    FOR(i,0,len-1){
        int id=str[i]-'a';
        if(p->next[id]==NULL){
            q=(Trie *)malloc(sizeof(Trie));
            q->v=1;
            FOR(j,0,MAX-1)
                q->next[j]=NULL;
            p->next[id]=q;
            p=p->next[id];
        }
        else {
            p->next[id]->v++;
            p=p->next[id];
        }
    }
    //p->v=1;
}
int find_Trie(char *str){
    int len=strlen(str);
    Trie *p=&root;
    FOR(i,0,len-1){
        int id=str[i]-'a';
        if(p->next[id]==NULL)
            return 0;
        p=p->next[id];
    }
    return p->v;
}
int main(){
    char str[11];
    FOR(i,0,MAX-1)
        root.next[i]=NULL;
    while(gets(str)&&str[0]!='\0')
        createTrie(str);
    while(rds(str)!=EOF)
        printf("%d\n",find_Trie(str));
    return 0;
}
/*
banana
band
bee
absolute
acm

ba
b
band
abc
*/

你可能感兴趣的:(C++,HDU,字典树)