背单词 | ||||||
| ||||||
Description | ||||||
大四了,Leyni感觉好惆怅,因为找不到工作,所以最后决定考研了,可是Leyni的英语好差,没办法,先从最基本的背单词开始吧。那么多单词怎么才好背呢,话说考研界盛传利用前缀背单词,貌似好神奇的样子。因为英语单词很多,Leyni想要知道以一个特定字符串做前缀的单词有多少,于是他来找你帮忙了。 | ||||||
Input | ||||||
输入首先包含若干行小写单词,表示字典里的单词,以END结束,然后是若干个询问字符串,表示单词的前缀。输入到文件结束。最多不超过50000个单词。每个单词长度不超过15。 | ||||||
Output | ||||||
对于每一个询问字符串,每行输出一个整数,表示单词表里有多少单词以此字符串作为前缀。 | ||||||
Sample Input | ||||||
a ab aba abcaa END aba a ab abcd | ||||||
Sample Output | ||||||
1 4 3 0 |
#include<bits/stdc++.h>
using namespace std;
#define MAX 26
struct trie
{
trie *next[MAX];
int sum;
} *rt;
void TrieTree(char *a)
{
trie *p = rt, *q;
int len = strlen(a);
for(int i = 0; i < len; i++)
{
int x = a[i] - 'a';
if(p->next[x] == NULL)
{
q = new trie;
q->sum = 1;
for(int j = 0; j < MAX; j++)
q->next[j] = NULL;
p->next[x] = q;
}
else
p->next[x]->sum++;
p = p->next[x];
}
}
int findx(char *a)
{
trie *p = rt;
int len = strlen(a);
for(int i = 0; i < len; i++)
{
int x = a[i] - 'a';
if(p->next[x] == NULL)
return 0;
p = p->next[x];
}
return p->sum;
}
void FreeTree(trie *p)
{
if(p == NULL)
return;
for(int i = 0; i < MAX; i++)
if(p->next[i] != NULL)
FreeTree(p->next[i]);
delete p;
return;
}
void init()
{
rt = new trie;
rt->sum = 0;
for(int i = 0; i < MAX; i++)
rt->next[i] = NULL;
}
int main()
{
char a[MAX];
init();
while(scanf("%s", a) != EOF)
{
if(strcmp(a, "END") == 0)
break;
TrieTree(a);
}
while(scanf("%s", a) != EOF)
printf("%d\n", findx(a));
FreeTree(rt);
return 0;
}