BZOJ 3676 回文串
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 回文串的更多相关文章
- 回文树(回文自动机) - BZOJ 3676 回文串
BZOJ 3676 回文串 Problem's Link: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 Mean: 略 analyse: ...
- bzoj 3676 回文串 manachar+hash
考虑每个回文串,它一定是它中心字母的最长回文串两侧去掉同样数量的字符后的一个子串. 所以我们可以用manachar求出每一位的回文半径,放到哈希表里并标记出它的下一个子串. 最后拓扑排序递推就行了.. ...
- BZOJ 3676 回文串(回文树)题解
题意: 一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值 思路: 回文树模板题,跑PAM,然后计算所有节点出现次数. 参考: 回文串问题的克星--Palindrome Tree(回文 ...
- BZOJ - 3676 回文串 (回文树)
https://vjudge.net/problem/HYSBZ-3676 题意 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s ...
- HYSBZ 3676 回文串 (回文树)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1680 Solved: 707 [Submit][Stat ...
- BZOJ 2342 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...
- BZOJ 2565 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长 ...
- bzoj 相似回文串 3350 3103 弦图染色+manacher
相似回文串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 143 Solved: 68[Submit][Status][Discuss] Descr ...
- 【BZOJ】【3676】【APIO2014】回文串
回文自动机/Manacher+SA 这道题可以用Manacher找出本质不同的回文串(令max增大的所有回文串),然后再用SA跑出来有多少相同. 还有一种做法就是回文自动机(Orz Hzwer)的裸题 ...
随机推荐
- Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码.动态抓取登录位置等,但由 ...
- hdu2002
import java.util.*;class Main{public static void main(String args[]){Scanner cin=new Scanner(System. ...
- as3 打开窗口类
package FlashCode.utils{ import flash.display.Sprite; import flash.net.URLRequest; import flash.net. ...
- CentOS允许/禁止ping的方法
一.临时生效 1.允许ping >/proc/sys/net/ipv4/icmp_echo_ignore_all 2.禁止ping >/proc/sys/net/ipv4/icmp_ech ...
- android获取Mac地址和IP地址
获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...
- PHP 根据值查找键名
array_search (PHP 4 >= 4.0.5, PHP 5) mixed array_search ( mixed $needle , array $haystack [, bool ...
- 牛皮市和猴市的好工具和指标:BOLL
(转贴)布林线BOLL用法 布林线是股市中经常用到的技术指标之一,它反映了股价的波动状况.山版软件指标图中的布林线由三条组成,上边的白线(up)是阻力线,下边的黄线(down)是支撑线,中间的粉红线( ...
- ios应用,今年最蛋疼的6月,IPV6!!
刚刚苹果大会结束,你是不是后悔没去听他的发布会,!!有钱么你? iPV6 国人蒙蔽了,介是什么鬼,经过两三次的残忍拒绝,我认真去研究了iPV6, 2.2 Details We discovered ...
- 如何改app图标名称
InfoPlist.strings文件里写上: CFBundleDisplayName="中文名字";