[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;
}
posted @ 2020-06-08 09:47  gdgzliu  阅读(129)  评论(0编辑  收藏  举报