传送门


假设字符串\(B,D\)满足\(|B| \geq |D|\),那么一定会有\(B=rev(D)+T\),其中\(T\)是一个回文串。

考虑枚举回文串\(T\)的中心\(p\),找到以\(p\)为中心的最长回文串\(S[l,r]\)。值得注意的是,回文串越长一定越好,因为如果回文串不是最长的,那么可以向左右拓展一位,\(B\)串长度会\(+1\),\(D\)串长度会\(-1\),没有变化。所以我们直接Manacher求最长回文串即可。

现在我们需要求的就是最小的\(i\)满足\(rev(S[i,l-1])\)是\(S[r+1,N]\)的子串。

发现对于所有可能的\(i\)都是\(S[1,l-1]\)的后缀。子串、后缀相关的问题可以考虑后缀自动机。我们对\(rev(S)\)建立SAM,对于SAM上的每一个节点记录最小的\(endpos\),并将\(S\)的所有前缀放到SAM上匹配。那么\(S[i,l-1]\)是SAM的parent树上\(S[1,l-1]\)的祖先。在parent树上倍增就可以得到满足条件的最小的\(i\)。

对于原串和反串各做一遍就可以得到最后的答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
//This code is written by Itst
using namespace std;#define PII pair < int , int >
const int MAXN = 2e5 + 7;
char s[MAXN];
int ind[MAXN] , len[MAXN] , L , ans;
PII ind1 , ind2;
bool flg = 0;namespace SAM{char S[MAXN];int Lst[MAXN] , trans[MAXN][26] , fa[MAXN] , endpos[MAXN] , jump[MAXN][19];int cnt = 1 , lst = 1;void insert(int l , int x){int p = lst , t = ++cnt; lst = t;Lst[t] = endpos[t] = l;while(p && !trans[p][x]){trans[p][x] = t; p = fa[p];}if(!p){fa[t] = 1; return;}int q = trans[p][x];if(Lst[q] == Lst[p] + 1){fa[t] = q; return;}int k = ++cnt; endpos[k] = 1e9;Lst[k] = Lst[p] + 1;fa[k] = fa[q]; fa[q] = fa[t] = k;memcpy(trans[k] , trans[q] , sizeof(trans[q]));while(trans[p][x] == q){trans[p][x] = k; p = fa[p];}}vector < int > ch[MAXN];void dfs(int x){for(int i = 1 ; jump[x][i - 1] ; ++i)jump[x][i] = jump[jump[x][i - 1]][i - 1];for(auto t : ch[x]){jump[t][0] = x; dfs(t); endpos[x] = min(endpos[x] , endpos[t]);}}void init(){memcpy(S , s , sizeof(S)); reverse(S + 1 , S + L + 1);for(int i = 1 ; i <= L ; ++i) insert(i , S[i] - 'a');for(int i = 2 ; i <= cnt ; ++i) ch[fa[i]].push_back(i);dfs(1);}int query(int x , int pos){if(endpos[x] <= pos) return x;for(int i = 18 ; i >= 0 ; --i)if(endpos[jump[x][i]] > pos)x = jump[x][i];return jump[x][0];}void clear(){memset(trans , 0 , sizeof(trans)); memset(Lst , 0 , sizeof(Lst));memset(fa , 0 , sizeof(fa)); memset(endpos , 0 , sizeof(endpos));memset(jump , 0 , sizeof(jump));for(int i = 1 ; i <= cnt ; ++i) ch[i].clear();cnt = lst = 1;}
}namespace Manacher{char S[MAXN];int Len[MAXN];void work(){for(int i = 1 ; i <= L ; ++i)S[(i << 1) - 1] = s[i];memset(Len , 0 , sizeof(Len));int maxR = 1 , maxI = 1;for(int i = 1 ; i < L << 1 ; ++i){Len[i] = min(maxR - i , Len[2 * maxI - i]);while(i - Len[i] >= 0 && i + Len[i] <= L << 1 && S[i - Len[i]] == S[i + Len[i]])++Len[i];int posL = (i - Len[i] + 1) / 2 + 1 , posR = (i + Len[i] + 1) / 2 - 1;if(posL <= posR){int u = SAM::query(ind[posL - 1] , L - posR) , l = u == ind[posL - 1] ? len[posL - 1] : SAM::Lst[u];if(ans < posR - posL + 1 + 2 * l){ans = posR - posL + 1 + 2 * l;ind1 = PII(posL - l , posR);if(l) ind2 = PII(L - SAM::endpos[u] + 1 , L - SAM::endpos[u] + l);else ind2 = PII(-1 , -1);flg = 1;}}if(maxR <= Len[i] + i){maxR = Len[i] + i;maxI = i;}}}
}void work(){flg = 0;SAM::init(); ind[0] = 1;for(int i = 1 ; i <= L ; ++i){int cur = ind[i - 1] , l = len[i - 1];while(cur && !SAM::trans[cur][s[i] - 'a']) l = SAM::Lst[cur = SAM::fa[cur]];!cur ? ind[i] = 1 : (ind[i] = SAM::trans[cur][s[i] - 'a'] , len[i] = l + 1);}Manacher::work();
}int main(){scanf("%s" , s + 1);L = strlen(s + 1); work();reverse(s + 1 , s + L + 1); SAM::clear(); work();if(flg){swap(ind2 , ind1); swap(ind1.first , ind1.second); swap(ind2.first , ind2.second);ind1.first = L + 1 - ind1.first; ind1.second = L + 1 - ind1.second;ind2.first = L + 1 - ind2.first; ind2.second = L + 1 - ind2.second;}printf("%d\n%d %d\n%d %d\n" , ans , ind1.first , ind1.second , ind2.first , ind2.second);return 0;
}

转载于:https://www.cnblogs.com/Itst/p/10527099.html

Gym101237C The Palindrome Extraction Manacher、SAM、倍增相关推荐

  1. HDU 6599:I Love Palindrome String Manacher+回文自动机

    题意 Problem Description You are given a string S=s1s2-s|S| containing only lowercase English letters. ...

  2. URAL1297 Palindrome【manacher算法】

    1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...

  3. P7046-「MCOI-03」诗韵【SAM,倍增,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P7046 题目大意 给出一个长度为 nnn 的字符串,然后 mmm 次把它的一个子串加入集合.如果一个字符串在这个集 ...

  4. NOI.AC#2144-子串【SAM,倍增】

    正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串sss和一个序列aaa.将字符串sss的所有本质不同子串降序排序后,求有多少个区间[l,r][l,r][l ...

  5. 2017CCPC哈尔滨 A:Palindrome(manacher+树状数组)

    题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=784 题意: 给你一个串s,求出满足S[i] ...

  6. [学习笔记]后缀自动机

    解决大部分字符串问题的大杀器 给一下clj课件:戳我 SAM是一个博大精深的算法.虽然没有像网络流家族,Tarjan家族一样拉帮结派,但是自身包含很多方法. 一.前言 字符串常见问题:各种匹配 1.L ...

  7. P3649-[APIO2014]回文串【PAM】

    正题 题目链接:https://www.luogu.com.cn/problem/P3649 题目大意 一个字符串,求最大的回文串长度×出现次数 解题思路 构建出PAM\text{PAM}PAM然后统 ...

  8. 基础省选+NOI-第6部分 字符串

    1.Kmp KMP算法 KMP算法_哔哩哔哩_bilibili KMP算法计算next函数值(教材版,超简单!) KMP算法计算next函数值(教材版,超简单!)_哔哩哔哩_bilibili KMP算 ...

  9. 《算法竞赛进阶指南》刷题记录

    总算闲下来一些辣!然后最近发现其实看书是真真很有效但是一直没有落实!所以决定落实一下这段时间把这本书看完题目做完! 然后发现还有挺多题目挺巧妙的于是一堆博客预警,,,可能最近会写很多比较水(但是我还是 ...

  10. win10获取NTLM哈希

    2020/03/13更新 文中的部分偏移地址有误,请参考原文中提供的DumpSomeHashes.py,这里面代码是正确的. ------ Retrieving NTLM Hashes and wha ...

最新文章

  1. python画圣诞树代码-圣诞节!教你用Python画棵圣诞树
  2. 提高雅思听力速度必须反复练耳朵别无捷径
  3. array_column php什么版本可以用,array_column兼容php5.5以下版本
  4. 【微机原理与接口技术】多功能可编程芯片 与 多功能电饭煲
  5. android jni 中jnienv,android JNI中JNIEnv類型和jobject類型的解釋
  6. java web 常用工具类_Javaweb常用工具类及配置文件备份
  7. CentOS 7 下安装 Redis
  8. Android编程知识点3-Intent
  9. 元宵节正月十五主题海报还没设计好,PSD分层模板来喽!
  10. Java集合存放有序不重复的对象
  11. python 图表 web_新手向——制作web图表(基于Python和GooPyCharts)
  12. 《C语言程序设计(第五版)谭浩强》学习笔记
  13. 基于MATLAB的有源三相滤波器的设计,基于MATLAB的有源滤波器的设计与仿真
  14. 腾讯云如何设置二级域名?
  15. 【价值积累】属于我的创业感悟
  16. 什么是云计算?云计算概念集合
  17. 网页配色不用愁!6条网页设计配色原则
  18. P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks论文笔记
  19. 小程序用户头像昵称,微信头像昵称填写onChooseAvatar(2022最佳实践uniapp和原生)
  20. 牛客网数量关系8道、判断推理8道、智力题8道

热门文章

  1. mysql innodb启动失败_关于mysql innodb启动失败无法重启的处理方法讲解
  2. mysql关于时间的面试题_关于面试中的mysql试题1
  3. Hive from_unixtime函数入门
  4. jQuery 停止动画
  5. javascript -- 事件--事件流-- 冒泡 --捕获
  6. 解析库之——beautifulsoup
  7. 第五次作业--原型设计(结对)
  8. CentOS 6.5 安装 java 环境
  9. T-SQL Parser
  10. 自搭Ngrok实现内网穿透centos6