Description

考虑一个只包含小写拉丁字母的字符串\(s\)。我们定义\(s\)的一个子串\(t\)的“出现值”为\(t\)在\(s\)中的出现次数乘以\(t\)的长度。请你求出\(s\)的所有回文子串中的最大出现值。

Input

输入只有一行,为一个只包含小写字母a-z的非空字符串\(s\)。

Output

输出一个整数,为所有回文子串的最大出现值。

Sample Input1

abacaba

Sample Input2

www

Sample Output1

7

Sample Output2

4

HINT

\(1 \le \mid s \mid \le300000\)

朴素做法:manacher+后缀数组。用manacher求出所有本质不同的回文串,对于每个本质不同的回文串,在后缀数组中二分出它的出现次数。复杂度\(O(nlogn)\)。(参见ZJOI模拟题BYcenbo palindrome

但是我们有回文自动机(参见:Palindromic Tree——回文树【处理一类回文串问题的强力工具】)。你知道回文自动机能做什么,你就能AC了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; typedef long long ll;
#define maxn (300010)
ll ans;
struct pat
{
int next[maxn][26],fail[maxn],cnt[maxn],len[maxn],s[maxn],last,n,p;
inline int newnode(int l) { cnt[p] = 0; len[p] = l; return p++; }
inline void init() { last = n = p = 0; newnode(0); newnode(-1); s[0] = -1; fail[0] = 1; }
inline int getfail(int x) { while (s[n-len[x]-1] != s[n]) x = fail[x]; return x; }
inline void add(int c)
{
s[++n] = c; int cur = getfail(last);
if (!next[cur][c])
{
int now = newnode(len[cur]+2);
fail[now] = next[getfail(fail[cur])][c];
next[cur][c] = now;
}
last = next[cur][c]; cnt[last]++;
}
inline void count()
{
for (int i = p-1;i >= 0;--i) cnt[fail[i]] += cnt[i];
for (int i = 0;i < p;++i) ans = max(ans,(ll)cnt[i]*len[i]);
}
}tree; int main()
{
freopen("3676.in","r",stdin);
freopen("3676.out","w",stdout);
tree.init();
while (true)
{
char ch = getchar();
if (ch >= 'a'&&ch <= 'z') tree.add(ch-'a');
else break;
}
tree.count(); printf("%lld",ans);
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 3676 回文串的更多相关文章

  1. 回文树(回文自动机) - BZOJ 3676 回文串

    BZOJ 3676 回文串 Problem's Link: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 Mean: 略 analyse: ...

  2. bzoj 3676 回文串 manachar+hash

    考虑每个回文串,它一定是它中心字母的最长回文串两侧去掉同样数量的字符后的一个子串. 所以我们可以用manachar求出每一位的回文半径,放到哈希表里并标记出它的下一个子串. 最后拓扑排序递推就行了.. ...

  3. BZOJ 3676 回文串(回文树)题解

    题意: 一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值 思路: 回文树模板题,跑PAM,然后计算所有节点出现次数. 参考: 回文串问题的克星--Palindrome Tree(回文 ...

  4. BZOJ - 3676 回文串 (回文树)

    https://vjudge.net/problem/HYSBZ-3676 题意 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s ...

  5. HYSBZ 3676 回文串 (回文树)

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1680  Solved: 707 [Submit][Stat ...

  6. BZOJ 2342 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...

  7. BZOJ 2565 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长 ...

  8. bzoj 相似回文串 3350 3103 弦图染色+manacher

    相似回文串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 143  Solved: 68[Submit][Status][Discuss] Descr ...

  9. 【BZOJ】【3676】【APIO2014】回文串

    回文自动机/Manacher+SA 这道题可以用Manacher找出本质不同的回文串(令max增大的所有回文串),然后再用SA跑出来有多少相同. 还有一种做法就是回文自动机(Orz Hzwer)的裸题 ...

随机推荐

  1. [WebGL入门]十四,绘制多边形

    注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...

  2. NETBSD-DTARCE

    http://www.openbsd.org/papers/ https://2015.asiabsdcon.org/timetable.html.en#T3A http://teachbsd.org ...

  3. Linux 精准获取进程pid--转

    如果想在脚本里只获取PID,那么可以用如下脚本.目前收集两种方法: 方法一 $ps x|grep xxx  |awk '{print $1}' e.g. ps x|grep java |awk '{p ...

  4. Properties文件,Data,Calendar类的使用

    package cn.hncu.day9; import java.io.FileInputStream;import java.io.FileNotFoundException;import jav ...

  5. Android开发之Toast解析

    Toast是Android系统提供的一个显示消息提示的类,它的使用非常简单,用途很广,如软件的升级,可以用它进行提示:退出程序时,也可以用它进行提醒,输入限制的提醒,等等. 使用场景: 1.需要提示用 ...

  6. RedHat7配置IdM server

    IdM服务器是一个集成身份验证服务器. Figure 1.1. The IdM Server: Unifying Services Authentication: Kerberos KDC Kerbe ...

  7. javascript 之原型理解

    最近一直在了解javascript原型的问题,也算是理解了一点,希望把我所理解的,用简单的例子和说明,让更多人清除的去理解javascript原型 1,原型 prototype 是一个什么东西 我们创 ...

  8. J2EE入门必备

    1,J2EE是什么 J2EE(Java 2 platform Enterprise Edition)是软件平台,适于创建服务器端的大型应用软件和服务系统. J2EE适合开发大规模的业务系统,这种级别的 ...

  9. Quartz-2D绘图之路径(Paths)详解

    在上篇文章中,我们简单的理解了绘图上下文,今天我们来认识一下Quartz-2D中另一个重要的概念,路径(Paths). 一.理解路径 路径定义了一个或多个形状,或是子路径.一个子路径可由直线,曲线,或 ...

  10. wireshark添加用户执行

    默认情况下,访问网络端口需要root权限,而wireshark的只是/usr/share/dumpcap的一个UI,/usr/share/dumpcap需要root权限,所以没法non-root用户无 ...