用Manacher算法枚举回文子串,每次在后缀数组排序后的后缀数组中二分,因为用某一后缀和其他子串分别求匹配的长度,匹配长度在排序后该后缀的两侧具有单调性(匹配长度为min{H[x]|i<=x<=j},所以对于查询min(H[x])用ST表O(n)预处理,O(1)查询即可.Manacher时间复杂度O(n),后缀数组复杂度O(nlogn),总复杂度O(nlogn).注意二分时的边界条件! #include <iostream> #include <cstdio> #in…
题意:求不同回文串的个数 n<=10^5 题解: 先按照manacher的构造方法改造一遍串,然后跑一遍manacher. 如ababa--> $#a#b#a#b#a#@ 然后跑一遍后缀数组. 对于一个后缀sa[i]~cl(cl为字符串的总长),我们本来是要加上以sa[i]为中心的回文串的个数p[sa[i]]. 但是这可能有重复! 我们可以维护一个tmp,也就是上图中蓝色的框.tmp表示以字符sa[i-1]为中心已经被统计过的回文串的个数. 到了当前的sa[i],tmp=min(tmp,h[i…
2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每次交换相邻两个位置的字符,使得 \(S\) 变成回文串,求最小交换次数. 分析: 首先,对于一个回文串,最多有一个字符出现次数为奇数,这个字符必须放在回文串的最中间,剩下的字符两边放就行. 对于一个字符 \(x\) ,一共在回文串中出现了 \(sizei_x\) 次,每次出现的位置为 \(pos_{…
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动机+倍增也可以解决. 首先可以一遍 \(\text{Manacher}\) 得到本质不同的回文串,然后分别求一次出现次数,更新答案.不能发现后缀自动机可以比较轻松的求出一个字串的出现次数,但是需要快速回答.所以需要快速找到一个字串在后缀自动机上的所属节点. 注意到后缀链接连接着一段后缀相等的位置,所…
题目链接 题意 : 给你一个串.要你将其划分成两个串.使得左边的串的本质不同回文子串的个数是右边串的两倍.对于每一个这样子的划分.其对答案的贡献就是左边串的长度.现在要你找出所有这样子的划分.并将贡献乘起来.答案 mod 1e9+7 分析 : 从左到右跑一边回文自动机.对于每个前缀 能够得出其有多少个本质不同的回文子串 本质不同的回文子串的个数实际上就是自动机节点数 - 2 那么跑一遍前缀之后我们能得到所有可作为左边部分串的本质不同回文子串的个数 因为是回文串.所以我们倒着跑一遍.就同样能得到作…
由于本质不同的回文子串数量是O(n)的,考虑在对于每个回文子串在第一次找到它时对其暴力统计.可以发现manacher时若右端点移动则找到了一个新回文串.注意这样会漏掉串长为1的情况,特判一下. 现在问题变为统计一个子串的出现次数.可以用SA,二分乱搞一下即可.这里使用SAM.以parent树上表示该子串的节点为起点,用倍增往上跳,找到深度最小的满足len限制的点就好了,出现次数就是其right集合的大小. uojAC,luoguRE一个点,bzojMLE…… #include<iostream>…
Подпалиндромы Problem's Link: http://informatics.mccme.ru//mod/statements/view.php?chapterid=1750# Mean: 给你一个长度不超过1e5的字符串,要统计总共有多少个回文串.(第一次刷俄语题,还好有google翻译). analyse: 如果题目说是不同回文串的话,这题就是一个裸的回文树. 由于要求所有子串的回文数,所以我们在插入的时候还需要使用suffixLink往上走统计答案. Time comp…
原文地址:http://www.cnblogs.com/GXZlegend/p/6802558.html 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串. 输入 一行由小写英文字母组成的字符串S. 输出 一行一个整数,表示最长双回文子串的长度. 样例输入 baacaabbacabb 样例输出…
Description 考虑一个只包含小写拉丁字母的字符串\(s\).我们定义\(s\)的一个子串\(t\)的"出现值"为\(t\)在\(s\)中的出现次数乘以\(t\)的长度.请你求出\(s\)的所有回文子串中的最大出现值. Input 输入只有一行,为一个只包含小写字母a-z的非空字符串\(s\). Output 输出一个整数,为所有回文子串的最大出现值. Sample Input1 abacaba Sample Input2 www Sample Output1 7 Sample…
Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串.其算法的基本原理就是利用已知回文串的左半部分来推导右半部分. 转:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足:s[i-rad[i],i-1]=s[i+1,i+rad[i]]很明显,求出了所有的rad,就求出了所有的长度为奇数的回文子串.至于偶数的怎么求,最…