[bzoj3676][Apio2014]回文串
Description
考虑一个只包含小写拉丁字母的字符串s。我们定义s的一个子串t的“出现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最大出现值。
Input
输入只有一行,为一个只包含小写字母(a-z)的非空字符串s。
Output
输出一个整数,为逝查回文子串的最大出现值。
Sample Input 1
abacaba
Sample Output 1
7
Sample Input 2
www
Sample Output 2
4
HINT
1≤|s|≤300000。
solution
回文树裸题...
#define K 26
#define N 300005
typedef long long ll;
ll ans,t[N];
int tr[N][K],nxt[N],len[N],a[N],n,cnt;
char c[N];
inline void Aireen(){
scanf("%s",c+1);n=strlen(c+1);a[0]=-1;
for(int i=1;i<=n;++i) a[i]=c[i]-'a';
len[++cnt]=-1;nxt[0]=nxt[cnt]=1;
for(int i=1,u=0,v;i<=n;++i){
while(a[i-len[u]-1]!=a[i]) u=nxt[u];
if(!tr[u][a[i]]){
++cnt;len[cnt]=len[u]+2;v=nxt[u];
while(a[i-len[v]-1]!=a[i]) v=nxt[v];
nxt[cnt]=tr[v][a[i]];tr[u][a[i]]=cnt;
}
++t[u=tr[u][a[i]]];
}
for(int i=cnt;i;--i)
t[nxt[i]]+=t[i];
for(int i=1;i<=cnt;++i)
ans=max(ans,1ll*t[i]*len[i]);
printf("%lld\n",ans);
}
2017-05-09 21:14:21