字典树HihoCoder - 1014

输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。

在20%的数据中n, m<=10,词典的字母表大小<=2.

在60%的数据中n, m<=1000,词典的字母表大小<=5.

在100%的数据中n, m<=100000,词典的字母表大小<=26.

本题按通过的数据量排名哦~

Output

对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

Sample Input

5
babaab
babbbaaaa
abba
aaaaabaa
babaababb
5
babb
baabaaa
bab
bb
bbabbaab

Sample Output

1
0
3
0
0
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char temp[100001];
int t[300001][30],pos=1,num[300001];
void insert(char *s)
{
	int rt = 0;
	int len = strlen(s);
	for (int i = 0; i < len; i++)
	{
		int x = s[i] - 'a';
		if (!t[rt][x])
			t[rt][x] = pos++;
		rt = t[rt][x];
		num[rt]++;//记录前缀次数
	}
}
void search(char *s)
{
	int rt = 0;
	for (int i = 0; s[i]; i++)
	{
		int x = s[i] - 'a';
		if (!t[rt][x])
		{
			printf("0\n");
			return;
		}
		rt = t[rt][x];
	}
	printf("%d\n", num[rt]);
}
int main()
{
	int n, m;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%s", temp),
		insert(temp);
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
		scanf("%s", temp),
		search(temp);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42060896/article/details/81872756