马拉车+哈希求条
查看原帖
马拉车+哈希求条
1164775
Jadonyzx楼主2024/12/30 21:35
#include<bits/stdc++.h>
#define int unsigned __int128
#define maxn 2000010
using namespace std;
namespace IO{
	inline int read(){
		int x=0,f=1;
		char ch=getchar();
		while(ch<'0'||ch>'9'){
			if(ch=='-')f=-1;
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
		return x*f;
	}
	inline void write(int x){
		if(x<0){putchar('-');x=-x;}
		if(x>=10)write(x/10);
		putchar(x%10+'0');return;
	}
}
using namespace IO;
int n,tot,r,p,ans;
char a[500010],s[maxn];
int dp[maxn];
int maxr[maxn];
int h[maxn],pre[maxn],suf[maxn],mul[maxn];
int Pre[maxn],Suf[maxn],uid[maxn];
const int base=998244353;
inline int HASH(int l,int r){return pre[r]-(pre[l-1]*mul[r-l+1]);}
inline int HASHbk(int l,int r){return suf[l]-(suf[r+1]*mul[r-l+1]);}
signed main(){
	n=read();mul[0]=1;
	for(int i=1;i<=n;++i)cin>>a[i];
	for(int i=1;i<=n;++i)pre[i]=pre[i-1]*base+a[i]-'a'+1;
	for(int i=n;i>=1;--i)suf[i]=suf[i+1]*base+a[i]-'a'+1;
	for(int i=1;i<=n+1;++i)mul[i]=mul[i-1]*base;
	s[++tot]='@';s[0]=s[tot+1]='@';
	for(int i=1;i<=n;++i)s[++tot]=a[i],uid[tot]=i,s[++tot]='@';
	for(int i=1;i<=tot;++i){
		if(i>r)while(s[i+dp[i]]==s[i-dp[i]])++dp[i];
		else{
			int j=p*2-i;
			dp[i]=min(r-i,dp[j]);
			while(s[i+dp[i]]==s[i-dp[i]])++dp[i];
		}
		if(i+dp[i]>r){
			r=i+dp[i];
			p=i;
		}
	}
	for(int id=1;id<=tot;++id){
		if(s[id]!='@')continue;
		int l=id-dp[id]+2;l=uid[l];
		int r=id+dp[id]-2;r=uid[r];
		if(r<=l)continue;
		if((r-l+1)%4!=0)continue;
		if(HASH(l,(l+r)/2)==HASHbk((l+r)/2+1,r))ans=max(ans,r-l+1);
	}
	write(ans);
	return 0;
}
2024/12/30 21:35
加载中...