前缀统计
题目链接:ybt高效进阶2-4-1
题目大意
有一堆字符串,然后每次有一个询问,问一个有多少个字符串是一个给出的字符串的前缀。
思路
这道题可以看出用 Trie 树(甚至有点模板),就建树就普通的建。
至于询问,其实我们可以按着长度推 Trie 数的位置,每次长度都是一个前缀。然后答案加上就可以。
当然,我们在询问的时候已经不用再重新建树,遇到没有这个分支的就可以直接结束了。
代码
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie {
char x;
int son[301], end;
}trie[1000001];
int n, m, cn, now, KK, re;
char c[1000001];
void build() {
//建Trie树
now = 0;
for (int i = 0; i < cn; i++) {
if (!trie[now].son[c[i]]) {
trie[now].son[c[i]] = ++KK;
trie[now].x = c[i];
}
now = trie[now].son[c[i]];
}
trie[now].end++;
}
int find() {
now = 0;
re = 0;
for (int i = 0; i < cn; i++) {
if (!trie[now].son[c[i]]) return re;
now = trie[now].son[c[i]];
re += trie[now].end;//一个一个前缀找
}
return re;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", c);
cn = strlen(c);
build();
}
for (int i = 1; i <= m; i++) {
scanf("%s", c);
cn = strlen(c);
printf("%d\n", find());
}
return 0;
}