给你一个由小写拉丁字母组成的字符串 ss。我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这个子串的长度。
对于给你的这个字符串 ss,求所有回文子串中的最大存在值。
PAM练习题。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+100;
int sz,tot,lst,ch[maxn][26],cnt[maxn],len[maxn],fail[maxn];
string s;
char ps[maxn];
struct PAM {
int node (int x) {
sz++;
memset(ch[sz],0,sizeof(ch[sz]));
len[sz]=x;
fail[sz]=cnt[sz]=0;
return sz;
}
void init () {
sz=-1;
lst=0;
ps[tot=0]='$';
node(0);
node(-1);
fail[0]=1;
}
int getFail (int x) {
while (ps[tot-len[x]-1]!=ps[tot]) x=fail[x];
return x;
}
void ins (char c) {
ps[++tot]=c;
int u=getFail(lst);
if (!ch[u][c-'a']) {
int x=node(len[u]+2);
fail[x]=ch[getFail(fail[u])][c-'a'];
ch[u][c-'a']=x;
}
lst=ch[u][c-'a'];
cnt[lst]++;
}
}pam;
int main () {
pam.init();
cin>>s;
for (char c:s) pam.ins(c);
long long ans=0;
for (int i=sz;i>=0;i--) cnt[fail[i]]+=cnt[i];
for (int i=1;i<=sz;i++) ans=max(ans,1ll*len[i]*cnt[i]);
printf("%lld
",ans);
}