CF17E Palisection manacher】的更多相关文章

CF17E Palisection(manacher/回文树) Luogu 题解时间 直接正难则反改成求不相交的对数. manacher求出半径之后就可以差分搞出以某个位置为开头/结尾的回文串个数. 然后就容易求出不相交的对数,用总数减去即为答案. 啊是的这题好像也可以用回文树做. #include<bits/stdc++.h> using namespace std; namespace RKK { const int N=4000011,mo=51123987; void doadd(in…
题面:洛谷(带翻译) 题解: 直接求相交不太好求,所以考虑求不相交的回文串对数. 设ll[i]表示以i为开头的回文串个数,rr[i]表示结尾<=i的回文串个数. 然后不相交的回文串对数显然就是对于每个$rr[i - 1] \cdot ll[i]$求一次和. 最后再用全集减去不相交的回文串对数即可求出相交的回文串对数. 那么如何求这2个数组呢? 对于每个最长回文半径r[i],它可以对一个区间做出贡献,即以它为中心那些回文串的开头or结尾都在一个区间内,相当于每个r[i]都可以对某个区间做区间加.…
题意 给出一个长度为N的字符串S,问S中有多少个回文子串对(i,j)使得i,j在S中的位置相交?(N<=2*106) 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; ; ],str[N*]; ],n,m,f[N*],g[N*],sum,ans,tot,num;…
题目大意: 给定一个串$S$,询问有多少对相交的回文子串 直接做的办法: 我们先考虑求出以$i$为结尾的串的数量,这个很好统计 之后,我们再求出所有包含了点$i$的回文串的数目 这个相当于在$i$的左边加上一个等差数列,右边同理可以统计出来 二次差分后维护这些东西就可以做到$O(n)$ 听起来就很难打.... 考虑反面 求出所有不相交的回文子串对的数目 只需要求出所有的回文串的数目 以及以点$i$为开头的串的数目,和以点$1 ... i - 1$为结尾的串的数目 这两个也十分统计 $O(n)$即…
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个串$s$询问,有多少对回文子串有交. 好像很简单的样子. 考虑能不能直接求,感觉有点麻烦.因为要考虑右端点在当前回文子串内还有区间包含问题. 那么考虑补集转化.问题转化成,考虑当前的回文串,之前有多少个回文串与它不相交. 跑一遍Manacher.然后先差分再二阶前缀和求出以第$i$个位置为右端点的回文子串的个数.然后再求一次前缀和就可以了. 然后再扫一遍就做完了. Code /** * Codeforces * Problem#1…
题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串个数%51123987 题解 首先,我们要知道一个串有多少个回文串. 1.manacher, 枚举回文中心可以计算出所有的回文串个数 (i+p[i]-1)-(i-p[i]+1)+1 然后我们怎么知道多少相交的回文串呢?计数问题要转化成有分界点的问题,便于利用乘法加法原理等.——lyd 这个相交显然不好处理,也…
题意 给定一个长度为n的小写字母串.问你有多少对相交的回文子串(包含也算相交) 相交的回文子串个数 \(mod\ 51123987\) Sol 求相交的回文子串不太好求 考虑用总数减去不相交的回文串个数 那么考虑求以一个点结尾的后缀回文串的贡献: 就是以它后面的点为开头的前缀回文串的个数 正反两遍回文树求一下就好了 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) mems…
题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串个数%51123987 题解 直接判断相交的回文串很难 那我们考虑找出所有不相交的回文串 数量就是所有以$i$结尾的回文串数乘以$i$后面的回文串数 以$i$结尾的回文串数就是在fail树里$i$的深度 然后$i$后面的回文串数只要倒着做一遍再记录一个后缀和就好了 然后记$sum$为总共的回文串数,回文串对数…
题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个位置为末尾的回文子串数量,这个数量就是此时构造末尾节点在$fail$树中的深度 再把串翻过来,用同样的方法求出每个位置为开头的回文子串数量 对其中一个数组求前缀和,用乘法原理算一下就行了 空间开不下怎么办?以时间换空间,用邻接表存儿子!每次跳儿子都暴力遍历一次邻接表 #include <cstdio…
题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串个数%51123987 Translated by liyifeng 题目描述 In an English class Nick had nothing to do at all, and remembered about wonderful strings called palindromes. We sh…
回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的fail指针指向它的最长回文后缀(不包括自身,所有空fail均连向1).归纳容易证明,当在原串末尾新增一个字符时,回文树上至多会新增一个节点,这也证明了一个串本质不同的回文子串个数不会超过n. 建树时采用增量构造法,当考虑新字符s[i]时,先找到以s[i-1]为结尾的节点p,并不断跳fail.若代表…
回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同) 2.求串S内每一个本质不同回文串出现的次数 3.求串S内回文串的个数(其实就是1和2结合起来) 4.求以下标i结尾的回文串的个数 每个变量的含义 1.len[i]表示编号为i的节点表示的回文串的长度(一个节点表示…
PAM 目录 PAM 功能: 回文树 Fail指针 Trans指针 构建PAM 应用 P5496[模板]回文自动机(PAM) P4287[SHOI2011]双倍回文 P4555[国家集训队]最长双回文串 P4762[CERC2014]Virus synthesis P1659[国家集训队]拉拉队排练 CF17E Palisection 注意:邻接链表PAM不是使空间变小了,而是用时间换空间 回文自动机 建议先学习AC自动机:AC自动机讲解超详细 回文自动机,顾名思义,用来处理回文串的自动机. 功…
Palisection(CF-17E) - 竞赛题解 Manacher学到一定程度,也需要练一下有趣的题了-- (这是多老的题了 \(QwQ\))[传送门] 『题意』 给出一个字符串,求总共有多少对不同的(只要位置不同)回文子串有重叠. 举个例子(样例):"babb" 有 "bab"(0~2) , "b"(0) , "a"(1) , "b"(2) , "b"(3) , "bb&…
[CF17E]Palisection(回文树) 题面 洛谷 题解 题意: 求有重叠部分的回文子串对的数量 所谓正难则反 求出所有不重叠的即可 求出以一个位置结束的回文串的数量 和以一个位置为开始的回文串的数量 然后对应的乘一下就行了 求法我用的是回文树 维护每个节点到根节点的距离, 就是回文后缀的数量 CF上的空间是\(128MB\) 卡的很 所以所有的连边考虑用邻接表来代替 #include<iostream> #include<cstdio> #include<cstdl…
Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and remembered about wonderful strings called palindromes. We should remind you that a string is called a palindrome if it can be read the same way both from…
https://vjudge.net/problem/CodeForces-17E http://codeforces.com/problemset/problem/17/E 题目大意:给一个长度为n的字符串,求不相交的回文串对数. ———————————————————————————— 点击这里看大佬的题解. #include<cstdio> #include<cstring> #include<algorithm> #define N 2000010 #defin…
卡空间PAM,2010没有PAM,所以都是马拉车 众所周知,PAM拥有十分优秀的时间复杂度,但空间复杂度lj得不行 但这题卡空间,所以得用到邻接链表PAM 先讲思路 题目要求相交的回文子串对,这很难做 于是我们求补集,求不相交的回文子串对,再用总数减即可 求法和上文的最长双回文子串 类似 正反建一次PAM,存该位置结尾的回文子串个数,然后加法改乘法 自己领悟一下,挺简单的. 现在讲一下邻接链表PAM 注意:邻接链表PAM不是使空间变小了,而是用时间换空间 我们记边结构体\(line\) 存\(3…
E. Palisection time limit per test 2 seconds memory limit per test 128 megabytes input standard input output standard output In an English class Nick had nothing to do at all, and remembered about wonderful strings called palindromes. We should remin…
Manacher以及回文树算法学习 一.Manacher 关于\(Manacher\),这篇博客 讲的很清楚. 大致总结一下 为了将长度为奇数的回文串和长度为偶数的回文串一起考虑,需要在原字符串中插入间隔字符,首尾也需要,处理后字符串长度为\(2 * len + 1\) \(Manacher\)算法用一个辅助数组\(Len[i]\)表示以字符\(T[i]\)为中心的最长回文字串的最右字符到T[i]的长度,比如以\(T[i]\)为中心的最长回文字串是\(T[l,r]\),那么\(Len[i]=r-…
好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一个字符串s,求最长回文子串. 回文子串的回文指的是abccba这种从前往后读和从后往前读一样. 子串必须连续(比如从i到j,s[i:j]),不是最长子序列(最长回文子序列怎么求?),子序列是可以不连续的. 算法大意 ans[i]表示以字符i为中心的最长回文子串的长度 now表示now+ans[now…
一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为中心的最长回文,奇数回文跟偶数回文一起考虑了 S $ # # # # # # # # # P 最后所求的值就是max(P[i]-) //输入,并处理得到字符串s,s[0]=$ void getp() { ], mx = , id = ; memset(p, , sizeof(p)); ; s[i]…
题一:别人介绍的一道题,题意是给出一个序列,我们要求出一段最常的连续子序列,满足:该子序列能够被平分为三段,第一段和第二段形成回文串,第二段和第三段形成回文串. 题二:BZOJ2342和这题非常的相似,BZOJ的题意是说求出一个最长的回文串,该串能平均分四段,满足整体是回文串,前一半是回文串,后一半也是回文串. 对于第一个问题的做法是:Manacher后,枚举每一个位置i(一定是#),作为第二个中心,那么我们就需要在[i-Mp[i], i]之间找到一个最小的j,满足以j为中心的回文串能够覆盖到位…
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文子串为 "cdzdc". 挑战 O(n2) 时间复杂度的算法是可以接受的,如果你能用 O(n) 的算法那自然更好. 一. 首…
Manacher's algorithm 以\(O(n)\)的线性时间求一个字符串的最大回文子串. 1. 预处理 一个最棘手的问题是需要考虑最长回文子串的长度为奇数和偶数的情况.我们通过在任意两个字符之间填充 # 的方法, 将原字符串 \(S\) 转化为辅助字符串 \(T\),具体例子如下: S = a b a a b a T = # a # b # a # a # b # a # 转化后便可不必再考虑奇偶问题,同时辅助字符串的长度也变为奇数. 转化后字符串\(T\)的长度为奇数: 在长度为奇数…
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 100000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 相关问题 最长回文子串 0 回文串划分 V2 640 回文串划分…
这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的.对于回文串想必大家都不陌生,就是正读反读都一样的字符串,比如 "bob", "level", "noon" 等等,那么如何在一个字符串中找出最长回文子串呢,可以以每一个字符为中心,向两边寻找回文子串,在遍历完整个数组后,就可以找到最长…
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题目是枚举中间字符O(n^2)时间过的,不过这题字符串长度限制为1e5,O(n^2)肯定会超时啦; 有个叫 manacher 的算法是时间复杂度为 O(n), 本题就是 manacher 模板题啦; 我们先看一下 manacher 算法这个东东; 首先回文串匹配奇数长度和偶数长度操作是不一样的, 我们…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3948 题意:给定一个字符串,求字符串本质不同的回文子串个数. 思路:主要参考该篇解题报告 先按照manacher的构造方法改造一遍串,然后跑一遍manacher.求出以i为中心的最长回文串长度p[i]. 然后跑一遍后缀数组,若已经求得后缀sa[i-1]对答案的贡献,然后现在计算后缀sa[i],本来是要加上以sa[i]为中心的回文串的个数p[sa[i]]. 我们可以维护一个tmp,也就是上图中蓝色的框…
https://leetcode.com/problems/longest-palindromic-substring/ manacher算法相关:http://blog.csdn.net/ywhorizen/article/details/6629268 class Solution { public: string longestPalindrome(string s) { char ch[2001];int p[2001]; ch[2*s.size()] = 0; for(int i =…