照着第四篇题解写的,60分求调QAQ
查看原帖
照着第四篇题解写的,60分求调QAQ
835807
ljjl楼主2023/8/15 14:27

rt

分数情况

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e2+1,M=2e6+1;
int n,m,son[N][26],fail[N],idx,len[N],now,sz,ans,q[N],last,u,max_len,tmp;
bool e[N],f[M];
char a[M];
inline void insert(char* s){
	now=0,sz=strlen(s);
	for(int i=0;i<sz;i++){
		if(!son[now][s[i]-'a'])
			son[now][s[i]-'a']=++idx,len[idx]=len[now]+1;
		now=son[now][s[i]-'a'];
	}
	e[now]=1;
}
void get_fail(){
	last=0,now=0;
	for(int i=0;i<26;i++)
		if(son[0][i])
			q[++last]=son[0][i];
	while(now<last){
		u=q[++now];
		for(int i=0;i<26;i++){
			if(son[u][i])
				fail[son[u][i]]=son[fail[u]][i],q[++last]=son[u][i];
			else
				son[u][i]=son[fail[u]][i];
		}
	}
}
int query(char* s)
{
	now=0,ans=0,f[0]=1,sz=strlen(s);
	for(int i=1;i<=sz;i++)
	{
		now=son[now][s[i-1]-'a'];
		if(ans+max_len<i)
			return ans; 
		for(int j=now;j;j=fail[j])
			if(e[now]){
				f[i]|=f[i-len[now]];
				if(f[i])
					break;
			}
		if(f[i])
			ans=i;
	}
	return ans;
}
signed main(){
	scanf("%lld%lld",&n,&m);
   	for(int i=1;i<=n;i++)
    	scanf("%s",a),insert(a),tmp=strlen(a),max_len=max(max_len,tmp);
    get_fail();
    for(int i=1;i<=m;i++)
    	scanf("%s",a),memset(f,0,sizeof(f)),printf("%lld\n",query(a));
    return 0;
}
2023/8/15 14:27
加载中...