[acwing142]前缀统计(trie/字典树)【模板】
题目分析
最基础的trie模板,一开始建立trie,然后逐个查询T,看在trie的路径上,有多少个结束标记,统计个数就是答案。注意本题数据说是MAXN<10^6, 给定内存空间是64Mb,实际测试MAXN<10^5。开大了会超内存。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int ch[maxn][26], tot;
int val[maxn]; // 结尾标记
char s[maxn];
void clear(){ //初始化
memset(ch, 0, sizeof(ch));
memset(val, 0, sizeof(val));
tot = 0;
}
void insert(){
int len = strlen(s);
int u = 0; // root
for(int i=0; i<len; i++){
int c = s[i]-'a';
if(!ch[u][c]) // 没有这个结点,新开辟
ch[u][c] = ++tot;
u = ch[u][c];
}
val[u] ++; // 标记结尾
}
int find(){
int len = strlen(s);
int u = 0;
int ans = 0;
for(int i=0; i<len; i++){
int c = s[i]-'a';
if(!ch[u][c]) // 找不到了
return ans;
else{
u = ch[u][c];
ans += val[u];
}
}
return ans;
}
int main(){
int n, m;
scanf("%d %d", &n, &m);
clear(); //初始化
for(int i=1; i<=n; i++){
scanf("%s", s);
insert(); // 建立trie
}
for(int i=1; i<=m; i++){
scanf("%s", s);
printf("%d\n", find()); // trie中查找前缀
}
return 0;
}