BZOJ5384 有趣的字符串题 回文树】的更多相关文章

神奇的结论: 一个字符串的所有回文后缀的长度,可以形成$k$个等差数列,$k$是$log$级的 考虑前$R$个字符组成的字符串,对于一个等差数列,假设组成这个等差数列的回文串,最短的叫$a$,最长的叫$b$ 对于右端点是$R$的询问,左端点在$[b$上一次出现的位置开头$+1$,$a$的开头$]$这一段区间的话,$ans$要$+1$ 不会证 自己画了画感觉好像挺对的 知道这个之后只要建出来回文树 询问按右端点排序 每做到一个点回答关于它的询问 最后一次出现的位置用线段树维护 区间加用树状数组维护…
拖了很久才补的回文树,感觉网上的博客都是一个做法..回文树统计不同种类的回文串出现次数,然后用字符串hash来判每个回文子串是否符合要求 #include<bits/stdc++.h> using namespace std; #define maxn 300005 #define mod 19260817 #define ll long long #define P 131 char s[maxn]; ll len,F[maxn],h[maxn]; ll has(int l,int r){…
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 问\(s\)串中所有本质不同的回文子串中有多少对回文子串满足\(a\)是\(b\)的子串. 思路 参考代码:传送门 本质不同的回文子串肯定是要用回文树的啦- 在建好回文树后分别对根结点为\(0,1\)的子树进行\(dfs\),处理出以每个结点为根结点的子树的大小\(sz\)(也就是说有多少个回文子串以其为中心)和其\(dfs\)序,回文子串包含除了作为其他回文子串的中心被包含外,还可以不作为中心被包含,而这一部分则需要靠回文树的\(fai…
题意:给你两个字符串,问你有多少对公共回文串. 思路:先对a字符串建回文树.然后再把b字符串加进去就好了. #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<cstring> #include<queue> #include<se…
The Problem to Slow Down You Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93645#problem/G Description http://7xjob4.com1.z0.glb.clouddn.com/76e435d3c21fa3cbeef1e76780086dc4 Input   Output Sample In…
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字符串某个前缀的最长回文后缀. 证明. 考虑一个回文串在字符串中第一次出现的位置, 记为 \(S_{p_1 ... p_2}\), 它一定是 \(S_{1 ... p_2}\)的最长回文后缀. 否则, 如果有 \(S_{p_3 ... p_2} (p_3<p_1)\) 也为回文串, 那么由于回文, \…
https://vjudge.net/problem/UESTC-1999 题意 对于一个初始为空的字符串S,你可以进行以下两种操作: 1. 在S的末尾加一个小写字母. 2. 移除S的最后一个字母. 每进行完一个操作,你需要统计S中回文串的数量. 分析 模板题,每次跑一遍回文树 #include<cstdio> #include<string.h> #include<cstring> #include<string> using namespace std;…
https://vjudge.net/problem/HYSBZ-3676 题意 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 分析 回文树模板题 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #inc…
KMP,扩展KMP和Manacher就不写了,感觉没多大意思.   之前感觉后缀自动机简直可以解决一切,所以不怎么写后缀数组.   马拉车主要是通过对称中心解决问题,有的时候要通过回文串的边界解决问题,这个时候回文树就用到了,又好写,又强大.   之前整理过一篇后缀自动机的.感觉还要整理一下,顺便把回文树,后缀数组也整理一下 很久没写专题了,如果有空,把回文自动机也学习一下. 一:回文树 前置技能: 马拉车,KMP. 其实也没关系,就是对比一下. 马拉车是利用对称的思想,得到每个点或者空格为对称…
A string is palindrome, if the string reads the same backward and forward. For example, strings like "a", "aa", "appa", "queryreuq" are all palindromes. For given empty string S, you should process following two que…
传送门 既然要求对每个前缀都求出答案,不难想到应该用回文树求出所有本质不同的回文子串. 然后考虑如何对这些回文子串的前缀进行去重. 结论:答案等于所有本质不同的回文子串长之和减去字典序相邻的回文子串的LCP长度之和. 这个结论其实不难理解.可以回忆后缀数组经典题目:求一个字符串本质不同的子串个数.道理是一样的. 然后就有思路了,从空串开始每次加一个字符,用一个set维护当前所有本质不同的回文子串(只存左右端点),如果产生了新的回文子串就扔进set里跟前驱后继xjb更新一下答案. 字典序比较用后缀…
[Aizu2292]Common Palindromes(回文树) 题面 Vjudge 神TMD日语 翻译: 给定两个字符串\(S,T\),询问\((i,j,k,l)\)这样的四元组个数 满足\(S[i,j],T[k,l]\)都是回文串并且\(S[i,j]=T[k,l]\) 题解 自己\(yy\)一下就会做了 回文树又叫做回文自动机,所以当然可以用来进行回文串的识别和匹配了 对于一个串构建\(PAM\)或者说回文树,统计一下每个回文串的出现次数 再用另外一个串在\(PAM\)上进行匹配,计算一下…
Подпалиндромы Problem's Link: http://informatics.mccme.ru//mod/statements/view.php?chapterid=1750# Mean: 给你一个长度不超过1e5的字符串,要统计总共有多少个回文串.(第一次刷俄语题,还好有google翻译). analyse: 如果题目说是不同回文串的话,这题就是一个裸的回文树. 由于要求所有子串的回文数,所以我们在插入的时候还需要使用suffixLink往上走统计答案. Time comp…
 Palindromes and Super Abilities Problem's Link: http://acm.timus.ru/problem.aspx?space=1&num=1960 Mean: 给你一个长度为n的字符串S,输出S的各个前缀中回文串的数量. analyse: 回文树(回文自动机)的模板题. 由于回文自动机中的p是一个计数器,也相当于一个指针,记录的是当前插入字符C后回文树中有多少个节点. 那么我们只需要一路插,一路输出p-2就行. p-2是因为一开始回文树中就有两个…
3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1680  Solved: 707 [Submit][Status][Discuss] Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出  现值"为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最  大出现值. Input 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. Outp…
前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Palindrome Automaton),是一类有限状态自动机,能识别一个字符串的所有回文子串 它可简化构建出回文树 回文自动机的构造 网上资料很多,不拿出来一步步说了,说一下数组意义.放个板子 $len[u]$表示节点$u$代表的回文串的长度 $ch[u][c]$代表在$u$的回文串两端添加字符$c$…
题目描述 记字符串 w 的倒置为 w^R^ .例如 (abcd)^R^=dcba , (abba)^R^=abba . 对字符串x,如果 x 满足 x^R^=x ,则称之为回文:例如abba是一个回文,而abed不是. 如果x能够写成的 ww^R^ww^R^ 形式,则称它是一个"双倍回文".换句话说,若要 x 是双倍回文,它的长度必须是 \(4\) 的倍数,而且 x , x 的前半部分, x 的后半部分都要是回文.例如 abbaabba 是一个双倍回文,而 abaaba 不是,因为它的…
题目描述 给你一个由小写拉丁字母组成的字符串 ss .我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这个子串的长度. 对于给你的这个字符串 ss ,求所有回文子串中的最大存在值. 输入输出格式 输入格式: 一行,一个由小写拉丁字母(a~z)组成的非空字符串 ss . 输出格式: 输出一个整数,表示所有回文子串中的最大存在值. 输入输出样例 输入样例#1: 复制 abacaba 输出样例#1: 复制 7 输入样例#2: 复制 www 输出样例#2: 复制 4 说明 [样例解…
题意 https://nanti.jisuanke.com/t/A1955 求所有本质不同的回文串转成数后的和. 思路 如果了解回文树的构造原理,那么这题就很简单了,回文树每个结点代表一个回文串,每添加一个字符会在两端加上这个字符,我们只需要用res[]数组表示原串的前缀和,然后每添加一个字符的贡献就是res[i]-res[i-len[c]]*10^(len[c]) ,i为这个字符的下标.c为字符,我们累加贡献即可.还是挺简单的,但不晓得当时为什么过的人不是很多.. 代码 #include<bi…
题意: 给出一个长度为偶数的字符串S,要求把S分成k部分,其中k为任意偶数,设为a[1..k],且满足对于任意的i,有a[i]=a[k-i+1].问划分的方案数. n<=1000000 题解: 反正我是不会做   (我是转载的yyb博客,巨佬写的超级超级详细)基本就是照着laofulaofu的打了一遍(laofu太强啦) 这题分成了两个步骤如果直接分kk段我们是没法直接判断的假设两段si,sk−i+1因为si=sk−i+1=x1x2.....xj  假设si的开始位置为p假设原串S的长度为nsi…
回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同) 2.求串S内每一个本质不同回文串出现的次数 3.求串S内回文串的个数(其实就是1和2结合起来) 4.求以下标i结尾的回文串的个数 每个变量的含义 1.len[i]表示编号为i的节点表示的回文串的长度(一个节点表示…
题意: 一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值 思路: 回文树模板题,跑PAM,然后计算所有节点出现次数. 参考: 回文串问题的克星--Palindrome Tree(回文树) 代码: #include<map> #include<set> #include<cmath> #include<cstdio> #include<stack> #include<ctime> #include<vector&…
[CF245H]Queries for Number of Palindromes(回文树) 题面 洛谷 题解 回文树,很类似原来一道后缀自动机的题目 后缀自动机那道题 看到\(n\)的范围很小,但是\(Query\)很多 所以提前预处理出每一段\(l,r\)的答案 时间复杂度\(O(n^2+Q)\) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #includ…
[CF17E]Palisection(回文树) 题面 洛谷 题解 题意: 求有重叠部分的回文子串对的数量 所谓正难则反 求出所有不重叠的即可 求出以一个位置结束的回文串的数量 和以一个位置为开始的回文串的数量 然后对应的乘一下就行了 求法我用的是回文树 维护每个节点到根节点的距离, 就是回文后缀的数量 CF上的空间是\(128MB\) 卡的很 所以所有的连边考虑用邻接表来代替 #include<iostream> #include<cstdio> #include<cstdl…
[SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<…
[BZOJ2160]拉拉队排练(回文树) 题面 BZOJ 题解 看着题目, 直接构建回文树 求出每个回文串的出现次数 直接按照长度\(sort\)一下就行了 然后快速幂算一下答案就出来了 这题貌似可以用Manacher做吧 求出以每个字符为中心的回文串的最大长度 然后搞一下前缀和就行了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cma…
[CF932G]Palindrome Partition(回文树,动态规划) 题面 CF 翻译: 给定一个串,把串分为偶数段 假设分为了\(s1,s2,s3....sk\) 求,满足\(s_1=s_k,s_2=s_{k-1}......\)的方案数 题解 反正我是不会做 基本就是照着\(laofu\)的打了一遍(laofu太强啦) 这题分成了两个步骤 如果直接分\(k\)段我们是没法直接判断的 假设两段\(s_i,s_{k-i+1}\) 因为\(s_i=s_{k-i+1}=x_1x_2.....…
[BZOJ2342]双倍回文(回文树) 题面 BZOJ 题解 构建出回文树之后 在\(fail\)树上进行\(dp\) 如果一个点代表的回文串长度为\(4\)的倍数 并且存在长度为它的一半的回文后缀 那么就是可行的 如何维护长度是一半的回文后缀? \(fail\)树上的父亲一定包括了它的所有的回文后缀 因此在\(fail\)树上\(dfs\),同时记录一下每个长度的回文出现的次数 这样访问到一个节点就可以直接检查了 #include<iostream> #include<cstdio&g…
[BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最长回文前缀怎么求? 把串反过来前缀不就变成后缀了吗? 所以构造两个回文树就好啦 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath&g…
https://nanti.jisuanke.com/t/30998 题意 给一串由0..9组成的数字字符串,求所有不同回文串的权值和.比如说“1121”这个串中有“1”,“2”,“11”,“121”三种回文串,他们的权值分别是1,2,11,121.最终输出ans=135. 分析 第一次知道马拉车是manacher...涨姿势了 在马拉车进行的过程中,进行子回文串的统计去重. 这里的哈希去重方法重点学习理解. #include <iostream> #include <cstdio>…