球棒卡空间
查看原帖
球棒卡空间
1007817
hutao_sdog楼主2024/12/28 09:57
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+10;
ll n,ans=0;
char s[N],a[N];
int top=0,belong[N],p[N];
int dp[N];
int f[N][25];
struct node{
	int maxlen[N],link[N];
	int ch[N][30];
	int id[N];
	int last,Size;
	vector<int> g[N];
	void init(){
		memset(maxlen,0,sizeof(maxlen));
		memset(link,0,sizeof(link));
		memset(ch,0,sizeof(ch));
		last=0;
		Size=0;
		for(int i=0;i<=600000;i++) g[i].clear();
		link[0]=-1;
	}
	void extend(){
		for(int i=1;i<=n;i++){
			int cur=++Size,c=s[i]-'a',p=last;
			maxlen[cur]=maxlen[last]+1;
			dp[cur]=1;
			id[i]=cur;
			while(p!=-1&&!ch[p][c]){
				ch[p][c]=cur;
				p=link[p];
			}
			if(p==-1) link[cur]=0;
			else{
				int q=ch[p][c];
				if(maxlen[p]+1==maxlen[q]) link[cur]=q;
				else{
					int copy=++Size;
					maxlen[copy]=maxlen[p]+1;
					link[copy]=link[q];
					for(int i=0;i<26;i++) ch[copy][i]=ch[q][i];
					while(p!=-1&&ch[p][c]==q){
						ch[p][c]=copy;
						p=link[p];
					}
					link[q]=link[cur]=copy;
				}
			}
			last=cur;
		}
		for(int i=1;i<=Size;i++) g[link[i]].push_back(i);
	}
	void dfs(int u,int fa){
		f[u][0]=fa;
		for(int v:g[u]){
			dfs(v,u);
			dp[u]+=dp[v];
		}
	}
	void check(int l,int r){
		if(l<1||r>n) return;
		int now=id[r];
		for(int i=20;i>=0;i--){
			if(maxlen[f[now][i]]>=r-l+1) now=f[now][i];
		}
		ans=max(ans,(ll)dp[now]*(r-l+1));
	}
}SAM;
void manacher(){
	a[++top]='~';
	for(int i=1;i<=n;i++){
		a[++top]='|';
		a[++top]=s[i];
		belong[top]=i;
	}
	a[++top]='|';
	a[++top]='`';
	int mid=0,r=0;
	for(int i=1;i<=top;i++){
		if(i<=r) p[i]=min(p[mid*2-i],r-i+1);
		else p[i]=1;
		SAM.check(belong[i-(p[i]-1)+1],belong[i+(p[i]-1)-1]);
		while(a[i-p[i]]==a[i+p[i]]){
			p[i]++;
			SAM.check(belong[i-(p[i]-1)+1],belong[i+(p[i]-1)-1]);
		}
		if(i+p[i]-1>=r){
			r=i+p[i]-1;
			mid=i;
		}
	}
}
int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	SAM.init();
	SAM.extend();
	SAM.dfs(0,0);
	for(int j=1;j<=20;j++){
		for(int i=0;i<=SAM.Size;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	manacher();
	cout<<ans;
	return 0;
}
2024/12/28 09:57
加载中...