Trie树_CH1601_前缀统计

版权声明:本文为博主原创作品, 转载请注明出处! https://blog.csdn.net/solider98/article/details/83862304

点此打开题目页面

思路分析:

    直接应用Trie树即可, 下面给出AC代码:

//CH1601_前缀统计
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 1e6 + 5;
int trie[MAX][26], nex[MAX], tot, cnt[MAX];//cnt[i]:trie[i]对应字符串结尾个数 
char s[MAX];
int main(){
	int N, M; scanf("%d %d", &N, &M);
	for(int i = 1; i <= N; ++i){
		int len = (scanf("%s", s + 1), strlen(s + 1)), k = 0;
		for(int i = 1; i <= len; k = trie[k][s[i] - 'a'], ++i)
			if(!trie[k][s[i] - 'a']) trie[k][s[i] - 'a'] = ++tot;
		++cnt[k];
	}
	for(int i = 1; i <= M; ++i){
		int len = (scanf("%s", s + 1), strlen(s + 1)), res = 0, k = 0;
		for(int i = 1; i <= len; ++i){
			if(!(k = trie[k][s[i] - 'a'])) break;	
			res += cnt[k];	
		} 
		cout << res << endl;
	}
	return 0;
}  

猜你喜欢

转载自blog.csdn.net/solider98/article/details/83862304
今日推荐