36tps求助
查看原帖
36tps求助
508909
ace_yulong楼主2024/7/17 15:04

求助谢谢

#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int n,q,T,t,vis[N][30],sum[N],cnt;
string s;
int gn(char x){//给每个字符一个数字编号 
	if (x>='A'&&x<='Z'){
		return x-'A';
	} 
	if (x>='a'&&x<='z'){
		return x-'a'+26;
	}
	return x-'0'+52;
}
void is(string s){//加入新的字符串
	int pl=0,len=s.size();
	for (int i=0;i<len;i++){
		int c=gn(s[i]);
		if (!vis[pl][c]) vis[pl][c]=++cnt;
		pl=vis[pl][c];
		sum[pl]++;
	} 
}
int find(string s){//寻找字符串
	int pl=0,len=s.size();
	for (int i=0;i<len;i++){
		int c=gn(s[i]);
		if (!vis[pl][c]) return 0;
		pl=vis[pl][c];
	} 
	return sum[pl];
}
int main(){
	cin>>T;
	while(T--){
		for (int i=0;i<=cnt;i++){
			for (int j=0;j<=200;j++){
				vis[i][j]=0;
			}
		}
		for (int i=0;i<=cnt;i++){
			sum[i]=0;
		}
		cnt=0;
		cin>>n>>q;
		for (int i=1;i<=n;i++){
			cin>>s;
			is(s);
		}
		for (int i=1;i<=q;i++){
			cin>>s;
			cout<<find(s)<<"\n";
		}
	}
	return 0;
}
2024/7/17 15:04
加载中...