完整一点的代码:
```cpp
int u=0,len=0;
long long ans=0;
for(int i=n;i>=1;i--)
{
while(u!=-1&&sam.to[u][a[i]-'a']==0)
{
u=sam.link[u];
if(u!=-1) len=sam.len[u];
}
if(u==-1) u=0,len=0;
else u=sam.to[u][a[i]-'a'],len++;
int r=i+len-1,v=u;
if(sam.mx[u]>=i&&sam.mx[u]<=r) ans=max(ans,1ll*(sam.mx[u]-i+1)*sam.siz[u]);
while(v!=-1&&!vis[v]&&sam.mx[v]<=r&&sam.len[v]>=sam.mx[v]-i+1)
{
vis[v]=true;
if(sam.mx[v]>=i) ans=max(ans,1ll*(sam.mx[v]-i+1)*sam.siz[v]);
v=sam.link[v];
}
}
```
by lovely_ckj @ 2023-02-08 15:54:20
感觉正确的做法应该是倍增跳到第一个 mx 不同的状态
by lovely_ckj @ 2023-02-08 16:23:18