首页 > 代码库 > HDU 1251 统计难题 (字典树)(查询是否为前缀)

HDU 1251 统计难题 (字典树)(查询是否为前缀)

统计难题

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


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 <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define lson(x) ((x<<1))
#define rson(x) ((x<<1)+1)
using namespace std;
typedef long long ll;
const int N=26;
const int M=1e6+10;
typedef struct TrieNode {
    int nCount;
    struct TrieNode *next[N];
} TrieNode;
TrieNode Memory[M];
int allocp=0;
void InitTrieRoot(TrieNode **pRoot) {
    *pRoot=NULL;
}
TrieNode *CreateTrieNode() {
    TrieNode *p;
    p=&Memory[allocp++];
    p->nCount=1;
    for(int i=1; i<N; i++) {
        p->next[i]=NULL;
    }
    return p;
}
void InsertTrie(TrieNode **pRoot,char *s) {
    int i,k;
    TrieNode *p;
    if(!(p=*pRoot))
        p=*pRoot=CreateTrieNode();
    i=0;
    while(s[i]) {
        k=s[i++]-a;
        if(p->next[k]) p->next[k]->nCount++;
        else p->next[k]=CreateTrieNode();
        p=p->next[k];
    }
}
int SearchTrie(TrieNode **pRoot,char *s) {
    TrieNode *p;
    int i,k;
    if(!(p=*pRoot))
        return 0;
    i=0;
    while(s[i]) {
        k=s[i++]-a;
        if(p->next[k]==NULL) return 0;
        p=p->next[k];
    }
    return p->nCount;
}
int main() {
    char str[11];
    TrieNode *Root=NULL;
    InitTrieRoot(&Root);
    while(gets(str)&&str[0]) {
        InsertTrie(&Root,str);
    }
    while(gets(str)) {
        printf("%d\n",SearchTrie(&Root,str));
    }
    return 0;
}

 

HDU 1251 统计难题 (字典树)(查询是否为前缀)