传送门
对原串建立一个后缀自动机,然后用反串在上面匹配。
如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l,maxpos][l,maxpos]就是一个回文串。
于是赶快码一波统计答案(很遗憾会wa)
因为有可能原串在答案中。
于是我们可以遍历其linklinklink链一直跳来更新答案。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
const int N=6e5+5;
int n;
char s[N];
struct SAM{int len[N],son[N][26],link[N],siz[N],pos[N],cnt[N],rk[N],tot,rt,last;bool vis[N]; SAM(){tot=rt=last=1,len[0]=-1;for(ri i=0;i<26;++i)son[0][i]=0;}inline void expand(int x,int Pos){int p=last,np=++tot;siz[last=np]=1,pos[np]=Pos,len[np]=len[p]+1;while(p&&!son[p][x])son[p][x]=np,p=link[p];if(!p){link[np]=rt;return;}int q=son[p][x],nq;if(len[q]==len[p]+1){link[np]=q;return;}len[nq=++tot]=len[p]+1,memcpy(son[nq],son[q],sizeof(son[q])),link[nq]=link[q];while(p&&son[p][x]==q)son[p][x]=nq,p=link[p];link[np]=link[q]=nq;}inline void topsort(){for(ri i=1;i<=tot;++i)++cnt[len[i]];for(ri i=2;i<=last;++i)cnt[i]+=cnt[i-1];for(ri i=1;i<=tot;++i)rk[cnt[len[i]]--]=i;for(ri i=tot;i;--i)siz[link[rk[i]]]+=siz[rk[i]],pos[link[rk[i]]]=max(pos[link[rk[i]]],pos[rk[i]]);}inline void query(){ll ans=0;int p=1,nowlen=0;for(ri i=n;i;--i){while(p!=rt&&!son[p][s[i]-'a'])p=link[p],nowlen=len[p];if(son[p][s[i]-'a'])++nowlen,p=son[p][s[i]-'a'];if(pos[p]<i+nowlen){if(i<=pos[p])ans=max(ans,(ll)(pos[p]-i+1)*siz[p]);for(ri nowp=link[p];nowp&&!vis[nowp];nowp=link[nowp]){vis[nowp]=1;if(i<=pos[nowp]&&i+len[nowp]-1>=pos[nowp])ans=max(ans,(ll)(pos[nowp]-i+1)*siz[nowp]);}}}cout<<ans;}
}sam;
int main(){scanf("%s",s+1),n=strlen(s+1);for(ri i=1;i<=n;++i)sam.expand(s[i]-'a',i);sam.topsort(),sam.query();return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10367829.html

2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)相关推荐

  1. [BZOJ3676][Apio2014]回文串

    [BZOJ3676][Apio2014]回文串 试题描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出现值"为t在s中的出现次数乘以t的长度.请你求出s的所有 ...

  2. 【回文自动机】bzoj3676 [Apio2014]回文串

    回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i ...

  3. [bzoj3676] [APIO2014]回文串

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出 现值"为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. In ...

  4. 2018.12.24-bzoj-2565-最长双回文串

    题目描述: 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同). 输入长度为n的 ...

  5. 【BZOJ3676】 [Apio2014]回文串(SAM,manacher)

    传送门 BZOJ 洛谷 Solution 考虑我们每找到一个回文串就更新一次答案,跑个SAM,这样子复杂度是爆炸的. 接下来的就是优化: 我们可以倍增跳直到跳不了,最后的siz就是出现次数. 没了?没 ...

  6. 【数据结构】自动机全家桶(AC、回文、后缀自动机)

    自动机全家桶 前言 一.AC自动机 1.优秀博客链接 2.问题模板 3.使用 4.本质 5.运用 6.代码模板 二.回文自动机(回文树) 1.优秀博客链接 2.问题模板 3.使用 4.本质 5.运用 ...

  7. [bzoj3676]回文串[后缀数组+Manacher]

    后缀数组+Manacher 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #in ...

  8. 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)

    传送门 samsamsam基础题. 题意简述:给出一个串,询问第kkk大的本质不同的串. 然而这就是弦论的简化版. 我们把samsamsam建出来然后贪心选择就行了. 代码: #include< ...

  9. 2682. 【WC2012选拔12.17】最长双回文串

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同). 输 ...

最新文章

  1. 如何更改远程Git存储库的URI(URL)?
  2. java beans 组件_如何利用JavaBeans在应用程序中创建组件?
  3. Zephyr应用笔记:mcuboot引导程序简单介绍
  4. 函数式编程很难,这正是你要学习它的原因
  5. 用c语言求最大公约数的流程图,如何用c语言求最大公约数和最小公倍数
  6. Centos6.5优化Tomcat7
  7. 1.不同角度的性能测试
  8. Suse Enterprise Server 11的安装
  9. VC11、VC14、VC15库 32位 64位 下载
  10. levelDB源码阅读-skiplist跳表 上
  11. 【linux】系统压力模拟工具stress
  12. 自助装机配置专家点评
  13. 五家渠市谷歌高清卫星地图下载
  14. 一款兼容Arduino的模拟TDS传感器
  15. 半小时一篇文过完C语言基础知识点
  16. 听YunOS“教父”王坚怎么说
  17. MySQL数据库比较工具 - mysqldbcompare
  18. ​力扣解法汇总954-二倍数对数组
  19. 来自Bitly的USA.gov数据,数据分析案例
  20. 鼠标指针下总出现一个滚动条似的方框,怎么办?有图

热门文章

  1. Linux系统中网络配置详解
  2. Spark- Checkpoint原理剖析
  3. PM2中无法开启ES6的解决方案
  4. hdu-acm steps FatMouse's Speed
  5. 未能为数据库 '*'中得对象'*'分配空间,因文件组'PRIMARY'已满
  6. maven jetty/tomcat/wildfly plugin部署应用到本地容器
  7. 【Python-ML】最小二乘法
  8. 【Python-ML】自适应线性神经网络(Adaline)
  9. 【正一专栏】希望才是深深让人绝望的东西-论国足
  10. 有关递归的三道算法题总结