bzoj 3676: [Apio2014]回文串 回文自动机
3676: [Apio2014]回文串
Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 844  Solved: 331
[Submit][Status][Discuss]
Description
考虑一个只包含小写拉丁字母的字符串s。我们定义s的一个子串t的“出 
现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最 
大出现值。
Input
输入只有一行,为一个只包含小写字母(a -z)的非空字符串s。
Output
输出一个整数,为逝查回文子串的最大出现值。
Sample Input
abacaba
【样例输入2] 
www
Sample Output
7
【样例输出2] 
4 
HINT
一个串是回文的,当且仅当它从左到右读和从右到左读完全一样。
在第一个样例中,回文子串有7个:a,b,c,aba,aca,bacab,abacaba,其中:
● a出现4次,其出现值为4:1:1=4
● b出现2次,其出现值为2:1:1=2
● c出现1次,其出现值为l:1:l=l
● aba出现2次,其出现值为2:1:3=6
● aca出现1次,其出现值为1=1:3=3
●bacab出现1次,其出现值为1:1:5=5
● abacaba出现1次,其出现值为1:1:7=7
故最大回文子串出现值为7。
【数据规模与评分】
数据满足1≤字符串长度≤300000。
模板题,在分析答案的范围时出了一点问题,对于全'a'的数据,我误认为最大值出现再sqrt(n)的位置,从而使答案不会爆int,然而事实上答案最大值应该出现再n/2位置,答案为(n/2)^2,需要开long long
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 310000
#define MAXT MAXN
struct pam_node
{
int nxt[];
int fail;
int len;
int cnt;
}pam[MAXT];
int topp=;
int last=;
char str[MAXN]; int main()
{
freopen("input.txt","r",stdin);
int n,m,x,y,z;
scanf("%s",str);
n=strlen(str);
pam[].len=;pam[].fail=;
pam[].len=-;pam[].fail=-;
for (int i=;i<n;i++)
{
while (str[i]!=str[i-pam[last].len-])last=pam[last].fail;
int cur;
if (!pam[last].nxt[str[i]-'a'])
{
pam[last].nxt[str[i]-'a']=++topp;
pam[topp].len=pam[last].len+;
cur=pam[last].nxt[str[i]-'a'];
last=pam[last].fail;
while (~last && str[i]!=str[i-pam[last].len-])last=pam[last].fail;
if (~last)
pam[cur].fail=pam[last].nxt[str[i]-'a'];
else
pam[cur].fail=;
}else
cur=pam[last].nxt[str[i]-'a'];
last=cur;
pam[last].cnt++;
}
for (int i=topp;i>=;i--)
if (pam[i].fail!=-)
pam[pam[i].fail].cnt+=pam[i].cnt;
long long ans=;
for (int i=;i<=topp;i++)
ans=max(ans,(long long)pam[i].len*pam[i].cnt);
printf("%lld\n",ans);
return ;
}
bzoj 3676: [Apio2014]回文串 回文自动机的更多相关文章
- BZOJ 3676: [Apio2014]回文串
		3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2013 Solved: 863[Submit][Status ... 
- 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串
		Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ... 
- ●BZOJ 3676 [Apio2014]回文串
		题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 题解: 后缀数组,Manacher,二分 首先有一个结论:一个串的本质不同的回文串的个 ... 
- BZOJ 3676 [Apio2014]回文串(回文树)
		[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题目大意] 考虑一个只包含小写拉丁字母的字符串s. 我们定义s的一个子串t的& ... 
- bzoj 3676: [Apio2014]回文串【回文自动机】
		回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 #include<iostream> #in ... 
- BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)
		题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ... 
- HYSBZ 3676   回文串 (回文树)
		3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1680 Solved: 707 [Submit][Stat ... 
- [Bzoj3676][Apio2014]回文串(后缀自动机)(parent树)(倍增)
		3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 3396 Solved: 1568[Submit][Statu ... 
- 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习
		写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ... 
随机推荐
- MyBatis(3.2.3) - Configuring MyBatis using XML, Mappers
			Mapper XML files contain the mapped SQL statements that will be executed by the application using st ... 
- .net求两个数的最大公约数和最小公倍数
			最大公约数:指两个或多个整数共有约束中最大的一个. 最小公倍数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个. /// <s ... 
- 分享我的2014年3月unity3d面试题与参考答案
			今年3月份面试unity3d游戏程序,先做的面试题,然后人事问了我几个之前游戏开发的问题,问我英语怎么样等等,介绍了公司情况和对unity3d程序的要求.之后就回来了,总共面了不到1个半小时吧.笔试答 ... 
- SQL Server的三种物理连接之Merge join(二)
			简介 merge join 对两个表在连接列上按照相同的规则排序,然后再做merge,匹配的输出. 下面这个动态图展示了merge join的详细过程. merge join示例 创建两个表 IF O ... 
- DOS批处理命令-几个固定名称的变量
			批处理中有一些变量的变量名称是固定的,具有特定的意义,接下来,我们来看看这些有特定意义的变量到底有什么意义. 1.%CD% 当前路径的路径名[盘符 + 路径] - 現在のディレクトリ文字列に ... 
- 关于MySql entity framework 6 执行like查询问题解决方案
			原文:关于MySql entity framework 6 执行like查询问题解决方案 本人不善于言辞,直接开门见山 环境:EF6.0.0.0+MySQL Server5.6+MySqlConnec ... 
- Java Thread UncaughtExceptionHandler
			有没有发生过这样的情况,你写的工作线程莫名其妙的挂了,如果不是被你刚好看到,拿只能抓瞎了,不知道啥原因了,因为异常的时候只会把stack trace打在控制台上,不会记在你想记得错误日志里,头皮都抓破 ... 
- 20141015--for语句2
			for语句,打印等腰三角形: 第一种方法:(使用for语句嵌套) 第二种方法:(定义string型变量) 以下是其他形状的等腰三角形: (穿插使用了for语句嵌套,定义string型) 
- OC5_NSFileManger
			// // main.m // OC5_NSFileManger // // Created by zhangxueming on 15/6/19. // Copyright (c) 2015年 zh ... 
- OC8_setter方法展开
			// // Person.h // OC8_setter方法展开 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zh ... 
