[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

原文地址:https://www.cnblogs.com/AireenYe/p/bzoj3676.html