扔一个雷看看有没有人帮
查看原帖
扔一个雷看看有没有人帮
439165
小涛涛??楼主2025/1/20 20:33

RT

#include<bits/stdc++.h>
using namespace std;
const int A=5e4+131,B=1e4+131,MA=5e5+1311;
char str[30];
int len,cnt,tir[MA][26],ed[MA],pas[MA];
inline bool isld(char ch) {
	return (ch>='A'&&ch<='Z')||(ch<='z'&&ch>='a')||isdigit(ch);
}
inline int map_char(char a) {
	return a-'a';
}
int mc(char a) {
	return map_char(a);
}
int dfs(bool uj=0,int nod=0,int i=0) {
	int ans=0,tmp=mc(str[i]);
	if(i==len)ans+=ed[nod];
	if(tir[nod][tmp])ans+=dfs(uj,tir[nod][tmp],i+1);
	if(!uj) {
		ans+=dfs(1,nod,i+1);//del01
		for(int j=0; j<=25; j++)if(tir[nod][j]&&j!=tmp) {
				ans+=dfs(1,tir[nod][j],i);//del02
				if(str[i]!=str[i+1])
					ans+=dfs(1,tir[nod][j],i+1);
			}
	}
	return ans;
}
void insert() {
	int now=0,tmp;
	for(int i=0; i<len; i++) {
		tmp=mc(str[i]);
		if(!tir[now][tmp])tir[now][tmp]=++cnt;
		now=tir[now][tmp];
		pas[now]++;
	}
	ed[now]++;
}
int find() {
	int now=0,tmp;
	for(int i=0; i<len; i++) {
		tmp=mc(str[i]);
		if(!tir[now][tmp])return dfs();
		now=tir[now][tmp];
	}
	if(ed[now])return -1;
	return dfs();
}
int in() {
	char ch=getchar();
	int cnt=0;
	for(; !isld(ch); ch=getchar());
	for(; isld(ch); ch=getchar())str[cnt++]=ch;
	str[cnt]=0;
	return cnt;
}
int main() {
	int n,m;
	cin>>n>>m;
	for(int i=0; i<n; i++) {
		len=in();
		insert();
	}
	for(int i=0; i<m; i++) {
		len=in();
		cout<<find()<<"\n";
	}
	return 0;
}
/*
4 1
abcd
abcde
aabc
abced
abcdd

*/
2025/1/20 20:33
加载中...