除了 Subtask 4 MLE 了几个之外都过了。
是这个做法本身就错了还是被卡空间了?
#include<bits/stdc++.h>
#define sd std::
// #define int long long
#define F(i,a,b) for(i=(a);i<=(b);i++)
#define f(i,a,b) for(i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define X first
#define Y second
#define Fr(a) for(auto it:a)
const int N=1.2e6+10;
struct state
{
int len,link;
sd map<int,int> nex;
}st[N];
int last,siz;
void init()
{
st[0].link=-1;
siz++;
}
bool dp[N][2];//记录两个
int cnt[N];
void extend(char c,int op)
{
int cur=siz++,p=last;
dp[cur][op]=1;
cnt[cur]=1;
st[cur].len=st[last].len+1;
while(p!=-1&&!st[p].nex.count(c))
{
st[p].nex[c]=cur;
p=st[p].link;
}
if(p==-1) st[cur].link=0;
else
{
int q=st[p].nex[c];
if(st[q].len==st[p].len+1)
{
st[cur].link=q;
}
else
{
int nw=siz++;
st[nw].link=st[q].link;
st[nw].len=st[p].len+1;
st[nw].nex=st[q].nex;
while(p!=-1&&st[p].nex[c]==q)
{
st[p].nex[c]=nw;
p=st[p].link;
}
st[cur].link=st[q].link=nw;
}
}
last=cur;
}
struct node
{
int nex;
int to;
}a[N];
int tot,head[N];
void add(int u,int v)
{
a[++tot].nex=head[u];
head[u]=tot;
a[tot].to=v;
}
void dfs(int u)
{
for(int i=head[u];i;i=a[i].nex)
{
int v=a[i].to;
dfs(v);
dp[u][0]|=dp[v][0];
dp[u][1]|=dp[v][1];
cnt[u]+=cnt[v];
}
}
int n,i;
char s[N];
void solve()
{
scanf("%s",s+1);
n=strlen(s+1);
init();
F(i,1,n) extend(s[i],0);
extend('{',0);
f(i,n,1) extend(s[i],1);
F(i,1,siz-1) add(st[i].link,i);
dfs(0);
long long ans=0;
F(i,0,siz-1) if(dp[i][1]&dp[i][0]) ans=MAX(ans,1ll*cnt[i]/2*st[i].len);
printf("%lld",ans);
}
signed main()
{
int T=1;
// T=read();
while(T--) solve();
return 0;
}