30 pts 求条
查看原帖
30 pts 求条
1398636
yezhengjie0000001楼主2025/1/22 17:17
#include<bits/stdc++.h>
using namespace std;
int n,m,tot=1,e;
string w[10010],q;
int tree[500010][40],num[500010];
int vis[500010];
int ord(char ch){
	return ch-'a'+1;
}
char z(int f){
	return 'a'+f-1;
}
void ins(string s){
	int p=1,t;
	for(int i=0;i<s.size();i++){
		t=ord(s[i]);
		if(tree[p][t]==0){
			tree[p][t]=++tot;
		}
		p=tree[p][t];
	}
	num[p]++;
	return ;
}
bool query(){
	int p=1,t;
	for(int i=0;i<q.size();i++){
		t=ord(q[i]);
		p=tree[p][t];
		if(p==0){
			return 0;
		}
	}
	return num[p];
}
void del(int p,int r,int k){
	if(r>=q.size()){
		if(!vis[p]) e+=num[p];
		vis[p]=1;
		return ;
	}
	if(p==0){
		return ;
	}
	int t=ord(q[r]);
	if(k==0){
		del(tree[p][t],r+2,k+1);
	}
	del(tree[p][t],r+1,k);
	return ;
}
void fill(int p,int r,int k){
	if(r>=q.size()){
		if(k==0){
			for(int i=1;i<=26;i++){
				if(!vis[tree[p][i]]) e+=num[tree[p][i]];
				vis[tree[p][i]]=1;
			}
		}else{
			if(!vis[p]) e+=num[p];
			vis[p]=1;
		}
		return ;
	}
	if(p==0){
		return ;
	}
	int t=ord(q[r]);
	if(k==0){
		for(int i=1;i<=26;i++){
			fill(tree[tree[p][i]][t],r+1,k+1);
		}
	}
	fill(tree[p][t],r+1,k);
	return ;
}
void change(int p,int r,int k){
	if(r>=q.size()){
		if(!vis[p]) e+=num[p];
		vis[p]=1;
		return ;
	}
	if(p==0){
		return ;
	}
	int t=ord(q[r]);
	if(k==0){
		for(int i=1;i<=26;i++){
			if(r+1<=q.size()-1){
				int _t=ord(q[r+1]);
				change(tree[tree[p][i]][_t],r+2,k+1);
			}else{
				if(i!=ord(q[q.size()-1])){
					e+=num[tree[p][i]];
				}
			}
		}
	}
	change(tree[p][t],r+1,k);
	return ;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>w[i];
		ins(w[i]);
	}
	while(m--){
		cin>>q;
		if(query()){
			cout<<-1<<'\n';
			continue;
		}else{
			del(1,0,0);
			fill(1,0,0);a
			change(1,0,0);
			cout<<e<<'\n';
			e=0;
		}
	}
	return 0;
}
2025/1/22 17:17
加载中...