没看懂。
代码拿着之前的改的,很唐
#include<bits/stdc++.h>
#define int long long
#define For(l,r,b) for(int b=l;b<=r;b++)
#define N 1002005
#define inf 1000000007ll
using namespace std;
string s,t;
int i,j,sa[N],rk[N],rk1[N],sec[N],tot[N],n,h[N],an[N];
int tr[N];
vector<pair<int,int>> p[N];
int ll[N],rr[N];
void change(int x,int y)
{
x+=2;
for(;x<=n+10;x+=x&-x) tr[x]=max(tr[x],y);
}
int ask(int x)
{
// cerr<<x<<endl;
x+=2;
int ans=-1;
for(;x>0;x-=x&-x) ans=max(ans,tr[x]);
return ans;
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cout.tie(0);
cin>>s;
n=s.length();
s='#'+s;
For(1,n,i) tot[s[i]]++,rk[i]=s[i];
For(1,128,i) tot[i]+=tot[i-1];
for(int i=n;i;i--) sa[tot[rk[i]]--]=i;
int sz=128;
for(int k=1;k<=n;k<<=1)
{
int cnt=0;
For(n-k+1,n,i) sec[++cnt]=i;
For(1,n,i) if(sa[i]>k) sec[++cnt]=sa[i]-k;
memset(tot+1,0,sz<<3);
For(1,n,i) ++tot[rk[i]];
For(1,sz,i) tot[i]+=tot[i-1];
for(int i=n;i>=1;i--) sa[tot[rk[sec[i]]]--]=sec[i];
memcpy(rk1+1,rk+1,n<<3);
sz=1;
rk[sa[1]]=1;
For(2,n,i) rk[sa[i]]=(rk1[sa[i]]==rk1[sa[i-1]]&&rk1[sa[i]+k]==rk1[sa[i-1]+k])?sz:++sz;
if(sz==n) break;
}
For(1,n,i)
{
int pt=max(0ll,h[rk[i-1]]-1);
while(s[i+pt]==s[sa[rk[i]-1]+pt]) pt++;
h[rk[i]]=pt;
}
h[1]=0;
t[0]=t[1]='#';
for(int i=1;s[i]!='\0';i++) t[i*2]=s[i],t[i*2+1]='#';
int l=0,r=0,mid=0,cnt=0;
for(int i=1;i<2*n+3;i++)
{
if(i<r) an[i]=min(an[mid*2-i],an[mid]+mid-i);
else an[i]=1;
while(i-an[i]>0&&t[i+an[i]]==t[i-an[i]])
{
an[i]++;
if(i+an[i]>r)
{
r=an[i]+i,mid=i;
if(an[i]>=2&&t[r]!='#')
{
int sl=(i-an[i])/2+1,le=an[i]-1;
p[rk[sl]].push_back({le,++cnt});
// cout<<sl<<" "<<le<<endl;
}
}
}
}
change(0,0);
for(int i=1;i<=n;i++)
{
change(h[i],i);
for(j=0;j<p[i].size();j++)
{
ll[p[i][j].second]=ask(p[i][j].first-1);
}
}
memset(tr,0,sizeof(tr));
int cons=400000;
change(0,cons-n-1);
for(int i=n;i>=1;i--)
{
change(h[i],cons-i);
for(auto v:p[i])
{
// cerr<<v.first<<" "<<v.second<<endl;
rr[v.second]=cons-ask(v.first-1)-1;
// cerr<<rr[v.second]<<endl;
}
}
int ans=1;
for(int i=1;i<=n;i++)
{
for(auto v:p[i])
ans=max(ans,max(1ll,rr[v.second]-ll[v.second]+1)*v.first);
}
cout<<ans;
return 0;
}