大佬们,爆0求调
查看原帖
大佬们,爆0求调
579761
yinglinhan楼主2023/8/3 10:34
#include<bits/stdc++.h>
#define maxn 3000000
using namespace std;
struct trie_node{
	int son[26];
	int fail,flag,dep;
	long long stat;
	void init(){
		memset(son,0,sizeof(son));
		fail=flag=dep=0;
	}
}tr[maxn];
queue <int> q;
int cnt,n,m,num;
char T[maxn];
void init(){
  for(int i=0;i<=cnt;i++)tr[i].init();
  cnt=0;
}
void insert(char *s){
	int u=0,len=strlen(s);
	for(int i=0;i<len;i++){
		int v=s[i]-'a';
		if(!tr[u].son[v])tr[u].son[v]=++cnt;
		u=tr[u].son[v];
	}
	if(!tr[u].flag)tr[u].flag=++num;
}
void build(){
	for(int i=0;i<26;i++){
		if(tr[0].son[i])q.push(tr[0].son[i]);
		//tr[0].son[i]=1;
	}tr[0].dep=1;
	//q.push(1);
	//tr[1].fail=0;
	while(!q.empty()){
		int u=q.front();q.pop();
		int Fail=tr[u].fail;
		tr[u].stat=tr[Fail].stat;//可能的长度 
		if(tr[u].flag)tr[u].stat|=(1<<tr[u].dep);
		for(int i=0;i<26;i++){
			if(!tr[u].son[i])tr[u].son[i]=tr[Fail].son[i];
			else{
				tr[tr[u].son[i]].fail=tr[Fail].son[i];
				tr[tr[u].son[i]].dep=tr[u].dep+1;
				q.push(tr[u].son[i]);
			}
		}
	}
}
int query(char *t){
	int u=0,len=strlen(t),mx=0;
	long long st=1;
	for(int i=0;i<len;i++){
		u=tr[u].son[t[i]-'a'];
		st<<=1;
		if(tr[u].stat&st)st|=1,mx=i+1;
	}
	return mx;
}
int main(){
	scanf("%d%d",&n,&m);
	init();
	for (int i=1;i<=n;i++) {
		scanf("%s",T);
	    insert(T);
	}
	build();
	for(int i=1;i<=m;i++) {
		scanf("%s",T);
	    printf("%d\n",query(T));
	}
	return 0;
}
2023/8/3 10:34
加载中...