输入
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。
输出
对于每一个询问,输出一个整数Ans,表示词典中的字符串为前缀的单词的个数。
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。
输出
对于每一个询问,输出一个整数Ans,表示词典中的字符串为前缀的单词的个数。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node
{
int next[26];
int cnt;
void init()
{
cnt = 0;
memset(next , -1, sizeof(next));
}
}T[1000006]; // 节点号
int le;
void insert(char *s)
{
int i = 0, p = 0;
while (s[i])
{
int x = s[i] - 'a';
if (T[p].next[x] == -1) //如果不存在该节点
{
T[le].init();
T[p].next[x] = le++; // 该节点p上加入边x 代表字符 le代表与边x相连的下一个节点号
}
p = T[p].next[x]; //到达下一个节点号
T[p].cnt++;
i++;
}
}
void query(char *s)
{
int i = 0, p = 0;
while (s[i]) //不断顺着树向下找,找到输出最后一个节点的cnt,找不到输出0
{
int x = s[i] - 'a';
if (T[p].next[x] == -1)
{
puts("0");
return;
}
p = T[p].next[x];
i++;
}
printf("%d\n", T[p].cnt);
}
int main()
{
int n, m;
char str[20];
while (~scanf("%d", &n))
{
le = 1;
T[0].init();
while (n--)
{
scanf("%s", str);
insert(str);
}
scanf("%d", &m);
while (m--)
{
scanf("%s", str);
query(str);
}
}
return 0;
}