http://acm.hdu.edu.cn/showproblem.php?pid=1251
第一道字典树,很好理解就是单词查找树(树形词典的味道),输入前缀返回从根节点到该节点组成的串为前缀的个数。注意内存丫!丫 ! 丫!
/*
hdu 1251 字典树
空间换时间,容易爆内存
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define INF 0x7fffffff
#define inf -INF
#define MM 12900
#define N 50
using namespace std;
typedef long long ll;
const int _max = 100 + 10;
struct Trie{
Trie *next[26];
int cnt;//从根节点到该节点组成的串为前缀的个数
}*root;
void insert(char *s){
Trie *p = root,*pnew;
for(int i = 0; i < strlen(s);++ i){
int x = s[i]-'a';
if(p->next[x]==NULL){
pnew = new Trie;
pnew->cnt = 1;
for(int j = 0; j < 26; ++ j)
pnew->next[j] = NULL;
p->next[x] = pnew;
}
else p->next[x]->cnt++;
p=p->next[x];
}
}
int search(char *s){
Trie *p = root;
for(int i = 0; i < strlen(s);++ i){
int x = s[i]-'a';
if(p->next[x]==NULL) return 0;
p=p->next[x];
}
return p->cnt;//从根节点到该节点组成的串为前缀的个数
}
void init(){
root = new Trie;
root->cnt = 0;
for (int i = 0;i < 26;i ++)
root->next[i] = NULL;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
char str[20];
init();
while(gets(str)&&strcmp(str,"")!=0){
insert(str);
}
while(gets(str)){
printf("%d\n",search(str));
}
return 0;
}