Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 10
简单的字典树统计
#include<cstdio> #include<vector> #include<algorithm> using namespace std; const int maxn = 400005; int f[maxn][27]; char s[100]; int main() { int tot = 0; while (gets(s)) { if (s[0] == 0) break; for (int i = 0, j = 0; s[i]; i++) { int k = s[i] - 'a' + 1; if (!f[j][k]) { f[j][k] = ++tot; memset(f[tot], 0, sizeof(f[tot])); } j = f[j][k]; f[j][0]++; } } while (gets(s)) { int j = 0; for (int i = 0; s[i]; i++) { int k = s[i] - 'a' + 1; if (f[j][k]) j = f[j][k]; else { j = 0; break; } } printf("%d\n", f[j][0]); } return 0; }