Time Limit: 2000MS Memory Limit: 65535KB 64bit IO Format: %I64d & %I64u

Description

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

Input

Output

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0

Trie树模板题。

ps：不给数据范围是闹哪样。。。？

AC代码：

#include <iostream>
#include <cstring>
using namespace std;
class trie
{
private:
int next[500000][26], ans[500000];
int root, l;
int newnode()
{
memset(next[l], -1, sizeof(next[l]));
ans[l++] = 0;
return l - 1;
}
public:
trie()
{
l = 0;
root = newnode();
}
void insert(char *buf)
{
int len = strlen(buf), now = root;
for (int i = 0; i < len; i++)
{
if (next[now][buf[i] - 'a'] == -1)
next[now][buf[i] - 'a'] = newnode();
now = next[now][buf[i] - 'a'];
ans[now]++;
}
}
int query(char *buf)
{
int len = strlen(buf), now = root;
for (int i = 0; i < len; i++)
{
now = next[now][buf[i] - 'a'];
if (now == -1)
return 0;
}
return ans[now];
}
}tr;
int main()
{
char s[15];
while (cin.getline(s, 12) && strlen(s))
tr.insert(s);
while (cin.getline(s, 12) && strlen(s))
cout << tr.query(s) << endl;
return 0;
}