0Wa求调
查看原帖
0Wa求调
539488
terabyte_connection楼主2024/10/16 19:37

rt

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int MAXN = 1e6+10;
struct trie{
	int end[N];
	int to[MAXN][26],idx;
	void init(){
		memset(end,0,sizeof end);
		for(int i=0;i<MAXN;i++)
			for(int j=0;j<26;j++)
				to[i][j]=-1;
	}
	void add(string s){
		int u = 0;
		for(int i=0;i<s.size();i++){
			if(to[u][s[i]-'a'] == -1)
				to[u][s[i]-'a']=++idx;
			if(i==s.size()-1)end[u]++;
			u = to[u][s[i]-'a'];
		}
	}
	int find(string s){
		int u = 0, ans = 0;
		for(int i=0;i<s.size();i++){
			ans += end[u];
			if(to[u][s[i]-'a'] == -1)return ans;
			u = to[u][s[i]-'a'];
		}
		return ans;
	}
	void debug(){
		for(int i=0;i<=idx;i++){
			printf("idx %d:[%d]",i,end[i]);
			for(int u=0;u<26;u++)
					printf("(%d,%c)",to[i][u],u+'a');
			cout<<endl;
		}
	}
}tr;
int main(){
	int n,m;
	cin>>n>>m;
	tr.init();
	while(n--){
		string s;cin>>s;
		tr.add(s);
	}
	while(m--){
		string s;
		cin>>s;
		cout<<tr.find(s)<<endl;
	}
	return 0;
} 
2024/10/16 19:37
加载中...