洛谷P5496 回文自动机【PAM】模板】的更多相关文章

回文自动机模板 1.一个串的本质不同的回文串数量是\(O(n)\)级别的 2.回文自动机的状态数不超过串长,且状态数等于本质不同的回文串数量,除了奇偶两个根节点 3.如何统计所有回文串的数量,类似后缀自动机,不需要重新拓扑排序,因为是按节点顺序插入的,所以逆序上传即可 建树的时候\(0\)节点为偶数长度回文的根 \(1\)节点为奇数长度回文的根 //#pragma GCC optimize("O3") //#pragma comment(linker, "/STACK:102…
洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b] (5 <a < b < 100,000,000)( 一亿)间的所有回文质数. 输入格式 第 1 行: 二个整数 a 和 b . 输出格式 输出一个回文质数的列表,一行一个. 输入输出样例 输入 #1 5 500 输出 #1 5 7 1…
回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同) 2.求串S内每一个本质不同回文串出现的次数 3.求串S内回文串的个数(其实就是1和2结合起来) 4.求以下标i结尾的回文串的个数 每个变量的含义 1.len[i]表示编号为i的节点表示的回文串的长度(一个节点表示…
目的:类似回文Trie树+ac自动机,可以用来统计一些其他的回文串相关的量 复杂度:O(nlogn) https://blog.csdn.net/Lolierl/article/details/99971257 https://www.luogu.org/problem/P5496 求出以每个位置结尾的回文子串个数,强制在线 #include<iostream> #include<cstdio> #include<cstring> using namespace std…
回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的fail指针指向它的最长回文后缀(不包括自身,所有空fail均连向1).归纳容易证明,当在原串末尾新增一个字符时,回文树上至多会新增一个节点,这也证明了一个串本质不同的回文子串个数不会超过n. 建树时采用增量构造法,当考虑新字符s[i]时,先找到以s[i-1]为结尾的节点p,并不断跳fail.若代表…
https://www.luogu.org/problem/P3649 #include <bits/stdc++.h> using namespace std; typedef long long ll; struct Node { int len, ch[26], fail; int cnt; Node(int len = 0) : len(len), fail(0) { memset(ch, 0, sizeof(ch)); //下面是维护额外信息 cnt=0; } }; const in…
P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include <cstdio> #include <iostream> #include <cmath> ; using namespace std; int a[maxn],l,r; bool is_prime(int n) //判断素数 { int x = sqrt(n); ;i<…
处理回文串,Manacher算法也是很不错,但在有些问题的处理上比较麻烦,比如求本质不同的子串的数量还需要结合后缀数组才能解决.今天的们介绍一种能够方便的解决关于回文串的问题的算法--PAM. 一些功能: 假设我们有一个串S,S下标从0开始: 1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同) 2.求串S内每一个本质不同回文串出现的次数 3.求串S内回文串的个数(其实就是1和2结合起来) 4.求以下标i结尾的回文串的个数 构建回文数树 那么我…
题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数87: STEP1:87+78 = 165 STEP2:165+561 = 726 STEP3:726+627 = 1353 STEP4:1353+3531 = 4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884. 写一个程序,给定一个N(2<=N<=10,N=1…
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<cstring> #include<algorithm> using namespace std; ],b[],n,sum; void zhuan(int a[]) //字符串转化成数字 { ]; cin>>n; scanf("%s",s); a[]…