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> ...
随机推荐
- android 仿微信聊天界面,以及语音录制功能
extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 ...
- 增量式PID的matlab实现
首先,增量式PID的实现公式: 式中 Δe(k)=e(k)-e(k-1) 进一步可以改写成 式中 . . 为了便于理解,也可写成: 式中e(k)为第k次采样时的设定值与实际值的差,e(k-1 ...
- html 标准属性不要用 setAttribute 方法
html 中有些属性,譬如 checked , autofocus 只要存在就会有效,即使值是 false ,譬如: <input autofocus=false id='test'> & ...
- javascript飞机大战-----003创建英雄机
/* 英雄机:因为英雄机只有一辆所以不需要用构造函数 */ var Hero = { //初始图片 self:null, //初始left left:0, //初始top top:0, //生命值 l ...
- yii2GridView的简单使用
GridView::widget([ 'dataProvider' => $dataProvider,// 你传过来的ActiveDataProvider // 'filterModel' =& ...
- Object 对象有哪些方法?
这个不看还真不一定能说全,请养成良好的阅读源码和JDK文档的习惯. 总结一下:一共11个,wait的3个+notify的2个,hashCode和equals还有toString共3个,然后clone和 ...
- Python使用pyMysql模块插入数据到mysql的乱码解决
1.初步安装mysql,插入中文字符,出现的???的形式 终端提示: pymysql.err.InternalError: (1366, "Incorrect string value: ' ...
- Network of Schools---poj1236(强连通分量)
题目链接 题意:学校有一些单向网络,现在需要传一些文件 求:1,求最少需要向几个学校分发文件才能让每个学校都收到, 2,需要添加几条网络才能从任意一个学校分发都可以传遍所有学校. 解题思路(参考大神的 ...
- HTTP 请求头中的 X-Forwarded-For(转)
原文:https://imququ.com/post/x-forwarded-for-header-in-http.html 我一直认为,对于从事 Web 前端开发的同学来说,HTTP 协议以及其他常 ...
- OpenStack功能简介
为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中间不够了也不能加,超了也不退钱 二 ...