洛谷P4287 [SHOI2011]双倍回文(回文自动机)
听说有大佬用manacher$O(n)$过此题……太强啦……
说一下PAM的做法吧。(看了题解之后发现)蛮简单的
我们肯定要先建出回文自动机的
然后如果是枚举每一个节点暴跳fail指针肯定得T
那么我们对于每一个节点记录一个$trans[i]$,表示小于等于它长度一半的节点
这个可以在建自动机的时候顺便求出来,具体看代码
然后对每一个节点判断长度是否模4为0且$trans[i]$的长度是它的一半就好了
//minamoto
#include<cstdio>
#include<cstring>
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
const int N=;
int fail[N],ch[N][],cnt[N],len[N],trans[N];
int n,m,tot,last,p,q,ans;
char s[N];
inline int newnode(int x){
len[++tot]=x;return tot;
}
inline int getfail(int x,int n){
while(s[n--len[x]]!=s[n]) x=fail[x];return x;
}
void build(){
for(int i=;s[i];++i){
int x=s[i]-'a';
p=getfail(last,i);
if(!ch[p][x]){
q=newnode(len[p]+);
fail[q]=ch[getfail(fail[p],i)][x];
ch[p][x]=q;
if(len[q]<=) trans[q]=fail[q];
else{
int tmp=trans[p];
while(s[i--len[tmp]]!=s[i]||(len[tmp]+)*>len[q]) tmp=fail[tmp];
trans[q]=ch[tmp][x];
}
}
cnt[last=ch[p][x]]++;
}
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
scanf("%s",s+);
s[]=-,fail[]=,last=;
len[]=,len[]=-,tot=;
build();
for(int i=tot;i>=;--i) cnt[fail[i]]+=cnt[i];
for(int i=;i<=tot;++i)
if((len[trans[i]]<<)==len[i]&&len[i]%==) cmax(ans,len[i]);
printf("%d\n",ans);
return ;
}
洛谷P4287 [SHOI2011]双倍回文(回文自动机)的更多相关文章
- 洛谷 P4287 [SHOI2011]双倍回文题解
前言 用了一种很奇怪的方法来解,即二分判断回文,再进行某些奇怪的优化.因为这个方法很奇怪,所以希望如果有问题能够 hack 一下. 题解 我们发现,这题中要求的是字符串 \(SS'SS'\),其中 \ ...
- Manacher || BZOJ 2342: [Shoi2011]双倍回文 || Luogu P4287 [SHOI2011]双倍回文
题面:[SHOI2011]双倍回文 题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了 正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了: ...
- P4287 [SHOI2011]双倍回文(回文树)
题目描述 记字符串 w 的倒置为 w^R^ .例如 (abcd)^R^=dcba , (abba)^R^=abba . 对字符串x,如果 x 满足 x^R^=x ,则称之为回文:例如abba是一个回文 ...
- P4287 [SHOI2011]双倍回文
题意 考虑对每个节点\(x\)维护\(lastpos_x\)表示\(x\)的所有后缀回文串中第一个\(len\leqslant len_x/2\)并且能和\(x\)最后一个字符匹配的,之后枚举节点,判 ...
- 【洛谷P4555】最长双回文串
题目大意:给定一个长度为 N 的字符串 S,求 S 的最长双回文子串的长度,双回文子串定义为是 S 的一个子串,可以分成两个互不相交的回文子串. 题解:利用回文自动机 len 数组的性质,即:len ...
- 洛谷P4762 [CERC2014]Virus synthesis(回文自动机+dp)
传送门 回文自动机的好题啊 先建一个回文自动机,然后记$dp[i]$表示转移到$i$节点代表的回文串的最少的需要次数 首先肯定2操作越多越好,经过2操作之后的串必定是一个回文串,所以最后的答案肯定是由 ...
- 洛谷P4638 SHOI2011 银行 ( 最大流)
类似题目(一模一样):http://poj.org/problem?id=1149 我这里以poj1149的PIGS为例, 新建源点s和汇点t,n个顾客作为中间的点,,对于每个顾客,他可以解锁一定的猪 ...
- 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机
正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...
- 洛谷P2414 阿狸的打字机【AC自动机】【fail树】【dfs序】【树状数组】
居然真的遇上了这种蔡队题.瑟瑟发抖. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿 ...
随机推荐
- 使用common-dbutils进行dao操作
jar: 先引出database工具类: package cn.itcast.utils; public class Stu { private int id; private String snam ...
- MyBaties--Mapper configuration
method one: <!-- Using classpath relative resources --> <mappers> <mapper resource=&q ...
- Hibernate - 配置c3p0
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuratio ...
- unity破解步骤
1.选择unity的安装目录 C:\Programe Files (x86)\Unity\Editor 2.点击patch 3.使用random生成序列号 4.使用Cre Lic生成授权文件
- E比昨天更多的棒棒糖(Easy+Hrad)(华师网络赛)(DP||母函数||背包优化)
Time limit per test: 2.0 seconds Memory limit: 512 megabytes 唐纳德先生的某女性朋友最近与唐纳德先生同居.该女性朋友携带一 baby.该 b ...
- vs code 安装Scala
首先本机要安装scala(官网肿么下不了,CSDN上面下的): 配置scala到环境变量PATH中(Scala的根目录): VS中安装以下扩展: 1. Scala: 2. Sbt: 3. Code R ...
- BZOJ4003:[JLOI2015]城池攻占
浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...
- 洛谷【P1138】第k小整数
题目传送门:https://www.luogu.org/problemnew/show/P1138 桶排: 对于值域在可以接受的范围内时,我们可以用不依赖比较的桶排去将数据排序.因为桶排不依赖比较排序 ...
- 微服务理论之四:SOA
1.什么是SOA? SOA代表了面向服务的架构. SOA是一种使用松耦合的黑盒子服务构建业务应用的体系架构,这些服务可以通过编排连接在一起以实现特定的功能. 2.SOA特点 以下是服务的SOA的主要特 ...
- 杂项-Log:log4net
ylbtech-杂项-Log:log4net log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等) ...