Interesting HDU - 5785 回文树】的更多相关文章

题意: 找出所有[i,j]为回文串[j+1,k]也为回文串的i*k乘积之和. 题解: 设sum1[i] 为正着插入,到 i 的所有回文串的起始位置的前缀和,sum2[i] 表示反正插入的前缀和 ans+=sum1[i]*sum1[i+1] 上面的式子很容易让我们想到两遍回文树正着和反着插入操作, 回文树的num[]表示到达 i 这个节点的回文串个数 我们用一个sum[i]数组到 i 的时候所有出现的回文串的长度的前缀和 sum1[i] = (1LL * (i + 1) * pam.num[pam…
题意: 输出每个长度下的回文串(这些回文串的左半边也需要是回文串) 题解: 直接套上回文树,然后每找到一个回文串就将他hash. 因为符合要求的回文串本身是回文串,左半边也是回文串,所以它左半边也右半边相同, 自己画个图很容易发现的 每次hash判断一下就好了 #include <set> #include <map> #include <stack> #include <queue> #include <cmath> #include <…
题目链接 \(Description\) 给定一棵\(Trie\).求\(Trie\)上所有回文串 长度乘以出现次数 的和.这里的回文串只能是从上到下的一条链. 节点数\(n\leq 2\times 10^6\),字符集为a,b,c,d. \(Solution\) 如果不是树,就是回文树模板.对于树,DFS \(x\)的每个儿子的时候都用在\(x\)处的\(las\)即可,也就是按深度存一个\(las\)数组,每次用\(las[dep-1]\)做\(las\)去插入即可.(也可以回溯的时候直接删…
Sample Input 6 1 a 1 b 2 a 2 c 3 4 8 1 a 2 a 2 a 1 a 3 1 b 3 4 Sample Output 4 5 4 5 11 题意:多组输入,开始字符串为空,支持4中操作: 1,在字符串首加字符: 2,在字符串尾加字符: 3,查询字符串不同本质的回文串个数: 4,查询回文串个数总和 思路:因为支持首尾加入,所以和常规的回文树有些不同. 参考了YYB的博客. 发现首尾互相影响,当且仅当整个字符串是回文串. 其他情况两头正常加即可. #include…
Sample Input aca aaaa Sample Output 3 15 题意: 多组输入,每次给定字符串S(|S|<1e5),求多少对不相交的回文串. 思路:可以用回文树求出以每个位置结尾的回文串数,那么累加得到前缀和: 倒着再做一遍得到每个位置为开头的回文串数,乘正向求出的前缀和即可. #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define…
Victor and String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/262144 K (Java/Others) Total Submission(s): 163    Accepted Submission(s): 78 Problem Description Victor loves to play with string. He thinks a string is charming as the…
Harry and magic string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 223    Accepted Submission(s): 110 Problem Description Harry got a string T, he wanted to know the number of T's disjoint…
CA Loves Palindromic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 301    Accepted Submission(s): 131 Problem Description CA loves strings, especially loves the palindrome strings. One day…
题意: 有n种操作,开始给你一个空串,给你4中操作 1 c  在字符串的首部添加字符c 2 c  在字符串的尾部添加字符c 3  询问字符中的本质不同的回文串的个数 4 询问字符串中回文串的个数 思路:last[0]表示首部的操作的位置,last[1]表示尾部的操作的位置 模板提,用上双向的回文树就好了. #include <set> #include <map> #include <stack> #include <queue> #include <…
题意 找如下子串的个数: (l,r)是回文串,并且(l,(l+r)/2)也是回文串 思路 本来写了个回文树+dfs+hash,由于用了map所以T了 后来发现既然该子串和该子串的前半部分都是回文串,所以该子串的前半部分和后半部分是本质相同的! 于是这个log就去掉了 代码 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring>…
题意: 定义一个串为\(super\)回文串为: \(\bullet\) 串s为主串str的一个子串,即\(s = str_lstr_{l + 1} \cdots str_r\) \(\bullet\) 串s为回文串 \(\bullet\) 串\(str_lstr_{l + 1}...str_{\llcorner (l + r) / 2 \lrcorner}\)也是回文串 问长度为1.2.3 \(\cdots n\)的\(super\)回文串分别出现了几次 思路: 回文树建一下,然后每次新建一个…
KMP,扩展KMP和Manacher就不写了,感觉没多大意思.   之前感觉后缀自动机简直可以解决一切,所以不怎么写后缀数组.   马拉车主要是通过对称中心解决问题,有的时候要通过回文串的边界解决问题,这个时候回文树就用到了,又好写,又强大.   之前整理过一篇后缀自动机的.感觉还要整理一下,顺便把回文树,后缀数组也整理一下 很久没写专题了,如果有空,把回文自动机也学习一下. 一:回文树 前置技能: 马拉车,KMP. 其实也没关系,就是对比一下. 马拉车是利用对称的思想,得到每个点或者空格为对称…
URAL - 1960   Palindromes and Super Abilities 回文树水题,每次插入时统计数量即可. #include<bits/stdc++.h> using namespace std; #define eps 1e-9 #define For(i,a,b) for(int i=a;i<=b;i++) #define Fore(i,a,b) for(int i=a;i>=b;i--) #define lson l,mid,rt<<1 #d…
回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. 其次它类似自动机,有一个fail指针,一个节点的fail指针指向这个回文串的最长回文后缀.比如说abbaabba的fail指向abba的最后一个a. 利用回文树,我们可以在线性(不太确定是线性还是\(nlogn\)?)的时间内求出所有本质不同的回文子串,以及以每个字母结尾的最长回文子串. 有一个定理…
第一个能看懂的论文:国家集训队2017论文集 这是我第一个自己理解的自动机(AC自动机不懂KMP硬背,SAM看不懂一堆引理定理硬背) 参考文献:2017国家集训队论文集 回文树及其应用 翁文涛 参考博客:回文树 一些定义 (回文)子串不包括空串. (回文)后缀不包括原串本身,如果找不到,就是空串. 定义 \(len[cur]\) 为 \(cur\) 节点的代表串长度,\(son[p][c]\) 表示一条转移路径,\(fail\) 表示失配指针. 定义 \(\Sigma\) 为字符集大小. \(c…
Description: 求本质不同回文子串的个数 Solution: 回文树模板,学一学贴一贴啊... Code: /*================================= # Created time: 2016-04-20 20:55 # Filename: hdu3948.cpp # Description: =================================*/ #define me AcrossTheSky&HalfSummer11 #include &l…
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…
[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…
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - 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…
https://nanti.jisuanke.com/t/30998 题意 给一串由0..9组成的数字字符串,求所有不同回文串的权值和.比如说“1121”这个串中有“1”,“2”,“11”,“121”三种回文串,他们的权值分别是1,2,11,121.最终输出ans=135. 分析 第一次知道马拉车是manacher...涨姿势了 在马拉车进行的过程中,进行子回文串的统计去重. 这里的哈希去重方法重点学习理解. #include <iostream> #include <cstdio>…
题目链接 \(Description\) 给定两个串\(S,T\),求两个串有多少对相同回文子串. \(|S|,|T|\leq 2\times 10^5\). \(Solution\) 好菜啊QAQ 这都没想到 对两个串分别建回文树,两个串有相同的回文串当且仅当存在相同的节点. 所以分别从两棵树的两个根(\(0\)和\(1\))DFS,只走两棵树相同的节点,把经过节点的贡献加上就行了. 不要求本质不同,所以要更新一次val[fail[x]]. 把两个串用'$'接成一个串,直接建\(PAM\),分…
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长度.答案就是\(\max\{R_i+L_{i+1}\}\).式子可能会有差别,因为Manacher会在里面加字符.当然我们直接只用'#'位置的\(L_i+R_i\)就可以更新答案啦. Manacher,然后对于位置\(i\),设它的最远延伸距离是\(ex_i\). 然后用\(i-j\)更新\(L_j…