BZOJ 3676 【APIO2014】 回文串
题目链接:回文串
我终于也会回文自动机辣!
其实吗……我觉得回文自动机(听说这玩意儿叫\(PAM\))还是比较\(simple\)的……至少比\(SAM\)友善多了……
所谓回文自动机,每个节点就代表一个回文串。回文自动机的每个节点有两个东西,一个是\(next\),一个是\(fail\)。\(next_{u,x}\)指向节点\(u\)所代表的回文串在两端各添加一个字符\(x\)得到一个新的回文串。\(fail_u\)则指向\(u\)这个节点的最长后缀回文串(不包括本身)。当然还有一个\(len\)数组记录每个节点代表的回文串的长度。
构造自动机之前首先需要构造两个节点\(0\),\(1\)。其中\(len_0=0\),\(len_1=-1\),并且\(fail_0=1\)。\(0\)号点代表的是空串,\(1\)号点代表的是不存在的串。
然后我们考虑如何加入一个字符。我们加入第\(n\)个字符\(c\),从以上个字符结尾的回文串\(x\)开始,一路跳\(fail\)直到我们找到了一个回文串为止。即如果\(s\)数组存了我们需要构建自动机的字符串,那么\(x\)节点满足\(s_n=s_{n-len_x-1}\)。不难发现,这样跳最多到\(1\)号点就终止了。然后,如果\(next_{x,c}\)存在,那么说明这个回文串已经出现过了,给它的次数加\(1\)即可。否则,我们就需要新建一个节点\(p\),那么显然\(len_p=len_x+2\)。到这里,\(len_1=-1\)的好处就显现出来了,让我们少了一个特判。然后,我们还需考虑\(fail_p\)。我们从\(fail_x\)开始找起,每次跳\(fail\),直到找到了一个回文串满足\(s_n=s_{n-len_x-1}\)为止。然后,\(fail_p\)就等于\(next_{x,c}\)了。
说了这么多,写起来还是很好写的。这道题就是板子题。下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 300010 using namespace std;
typedef long long llg; char a[maxn];
int l[maxn],s[maxn][26],f[maxn],tt,v[maxn],la;
llg ans; void add(int c,int n){
int p=la;
while(a[n-l[p]-1]!=a[n]) p=f[p];
if(!s[p][c]){
int np=++tt,k=f[p]; l[np]=l[p]+2;
while(a[n-l[k]-1]!=a[n]) k=f[k];
f[np]=s[k][c]; s[p][c]=np;
}
v[la=s[p][c]]++;
} llg solve(){
llg ans=0;
for(int i=tt;i>1;i--) v[f[i]]+=v[i],ans=max(ans,1ll*l[i]*v[i]);
return ans;
} int main(){
File("a");
l[++tt]=-1; f[0]=1;
scanf("%s",a+1); int n=strlen(a+1);
for(int i=1;i<=n;i++) add(a[i]-'a',i);
printf("%lld\n",solve());
return 0;
}
BZOJ 3676 【APIO2014】 回文串的更多相关文章
- BZOJ 3676: [Apio2014]回文串
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2013 Solved: 863[Submit][Status ...
- bzoj 3676: [Apio2014]回文串 回文自动机
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 844 Solved: 331[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 ...
- bzoj 3676 [Apio2014]回文串(Manacher+SAM)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题意] 给定一个字符串,定义一个串的权值为长度*出现次数,求最大权的回文子串. ...
- BZOJ.3676.[APIO2014]回文串(回文树)
BZOJ 洛谷 很久之前写(抄)过一个Hash+Manacher的做法,当时十分懵逼=-= 然而是道回文树模板题. 回文树教程可以看这里(真的挺妙的). 顺便再放上MilkyWay的笔记~ //351 ...
- bzoj 3676: [Apio2014]回文串【后缀自动机+manacher】
用manacher找出本质不同的回文子串放在SAM上跑 #include<iostream> #include<cstdio> #include<cstring> ...
随机推荐
- Python老王视频习题答案
基础篇2:一切变量都是数据对象的引用sys.getrefcount('test') 查看引用计数变量命名不能以数字开头编码:ascii.unicode.utf-81.阅读str对象的help文档,并解 ...
- Android Activity 半透明效果(Translucent)
本文转自:http://norety.javaeye.com/blog/648725 今天试着做activity半透明的效果,做出来之后才发现想复杂了!很简单的几句就可以实现,不多说了,贴代码! 1. ...
- mysql查看线程详解(转载)
如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的 MySQL 帐户运行的线程). mysql> show processlist; +—–+——— ...
- 【模块化开发】------requireJS的基本使用------【巷子】
前言 为了提高代码的复用度,开发人员会按照功能把大量的js代码分成若干文件,这样在多个页面就可以使用同一个文件了.,下面是某个网站的js引用情况 虽然代码的复用度提升了,但是缺点也体现了出来 缺点: ...
- Linux Git服务器安装
① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clone 远程仓库 ⑤ 客户端创建 SSH 公钥和私 ...
- JavaCSV之写CSV文件
与JavaCSV读CSV文件相对应,JavaCSV也可以用来写数据到CSV文件中. 1.准备工作 (1)第三方包库下载地址:https://sourceforge.net/projects/javac ...
- 精通linux设备驱动开发 笔记
3.2.7 错误处理 #include <linux/err.h> char * collect_data(char *userbuffer) { char *buffer; /* ...
- Day05 xml详解
day05总结 今日内容 XML语法 XML约束之DTD XML解析器介绍 XML解析之JAXP( DOM.SAX ) DOM4J Schema 一.XML语法 XML概述 1 什么是XML ...
- iis6下配置支持.net4.0&发布网站[转]
iis6配置支持.net4.0 在win2003操作系统上发布两个网站,首先配置iis: 1.下载 .net framework 4.0 差不多48MB 2.安装 3.打开iis: 开始=> ...
- Vector、List、LinkedList
Vector 遍历 Vector<String> vestor =new Vector<String>(); vestor.add("qq"); vesto ...