好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu)https://www.luogu.org/problemnew/show/P4762 题解: 先观察到三个(ju)性(fei)质(hua): 2操作的结果一定是一个回文串(废话), 最后一个2操作之后只能进行1操作(废话), 只进行1操作花费代价等于字符个数(废话) 三句废话连在一起说: 最后一次…
大意: 初始有一个空串, 操作(1)在开头或末尾添加一个字符. 操作(2)在开头或末尾添加该串的逆串. 求得到串$S$所需最少操作数. 显然最后一定是由某个偶回文通过添加字符得到的, 那么只需要求出所有偶回文的最少操作数即可. 结论: 偶回文最后一次进行翻倍操作一定最优. 证明考虑数学归纳, 对于长为$2$的回文串显然成立. 对长度$>2$的偶回文串$A$, 记最后一次翻倍得到的串$B$, $B$的一半为$C$. 记$f(S)$为串$S$的最优值, 就有$f(B)=f(C)+1$. 考虑由$B$…
bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp) bzoj Luogu 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符放在已有串开头或者结尾. 2.将已有串复制,然后reverse,再接在已有串的头部或者尾部. 一开始已有串为空.求最少操作次数. len<=100000 题解时间 一个非空串经过一次操作2之后一定是一个偶回文串. 所以考虑建出PAM之后dp. 由于只有偶回文串可以通过操作2产生,所以只有偶回文串参与…
4044: [Cerc2014] Virus synthesis Time Limit: 20 Sec  Memory Limit: 128 MB Description Viruses are usually bad for your health. How about fighting them with... other viruses? In  this problem, you need to find out how to synthesize such good viruses. …
题目大意: 你要用ATGC四个字母用两种操作拼出给定的串: 将其中一个字符放在已有串开头或者结尾 将已有串复制,然后reverse,再接在已有串的头部或者尾部 一开始已有串为空.求最少操作次数. len<=100000 题解: 我们一看 ! 这道题跟回文自动机没有半毛钱关系啊 !! 仔细分析一下第二个操作,我们发现这个操作过后实际上就产生了一个大回文串 所以我们可以考虑如何在回文自动机上搞 一开始想歪了,一直倒着想:如何把给定字符串消掉,然后一直没有想出来 其实这道题应该正着想 设\(f_i\)…
题目传送门 需要高级权限的传送门 题目大意 要求用两种操作拼出一个长度为$n$的只包含'A','T','G','C'的字符串 在当前字符串头或字符串结尾添加一个字符 将当前字符串复制,将复制的串翻转,接在当前字符串末尾或者当前字符串头部. 问最少的操作次数. 考虑正常的动态规划时怎么做的.用$f[i][j]$表示拼出给定串的$[l, r]$的最少用的步数.转移显然. 然而它的时间爆了.空间也爆了. 仔细观察发现,翻转完最后一个偶回文串后,两端的字符只能暴力插入. 但是一个串的本质不同的回文串的总…
题目大意: 你可以在一个串的开头或者末尾加入一个字符,或者把当前整个串$reverse$,然后接在前面或者后面,求达到目标串需要的最少操作次数 对目标串建出$PAM$ 定义$dp[x]$表示当前在回文树的x节点,拼凑出这个节点表示的回文串所需要的最小操作次数 $fa_{x}$表示沿着树边指向它的父亲,$pre_{x}$表示它的$fail$指针 如果它是奇回文串,一定不能被翻转得到,所以开头结尾各需要加上一个字符,$dp[x]=dp[fa_{x}]+2$ 如果它是偶回文串,可以被翻转得到 1.要么…
传送门 回文自动机的好题啊 先建一个回文自动机,然后记$dp[i]$表示转移到$i$节点代表的回文串的最少的需要次数 首先肯定2操作越多越好,经过2操作之后的串必定是一个回文串,所以最后的答案肯定是由一个回文串+不断暴力添加得来,那么答案就是$min(ans,dp[i]+n-len[i])$ 然后对于一个串$i$,如果它在前面和后面加上一个字母可以形成回文串$j$,则$dp[j]=dp[i]+1$ 为啥嘞?我们可以假设在形成$i$的之前一步把这个字母加上去,执行2操作后就可以变成$j$了 然后我…
题意 真是道回文自动机好题. 首先考虑答案必定是一个回文串+剩余部分的形式,因此可以建出回文自动机,之后考虑每个长度为偶数的回文串. 对于一个长度为偶数的回文串,设它在回文自动机上对应的节点为\(x\),我们对于每个\(x\)求出\(trans_x\)表示x的最长后缀回文串,满足\(len_{trans_x}\leqslant len_x/2\). 之后设\(f_x\)表示\(x\)拼成\(x\)这个串的最小代价,我们从\(0\)(偶根)出发进行\(bfs\),中途计算\(f_x\). 对于\(…
回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同) 2.求串S内每一个本质不同回文串出现的次数 3.求串S内回文串的个数(其实就是1和2结合起来) 4.求以下标i结尾的回文串的个数 每个变量的含义 1.len[i]表示编号为i的节点表示的回文串的长度(一个节点表示…
[CERC2014]Virus synthesis 初始有一个空串,利用下面的操作构造给定串 SS . 1.串开头或末尾加一个字符 2.串开头或末尾加一个该串的逆串 求最小化操作数, \(|S| \le 10^5\) 可以发现最终的答案必然是先构造出一个偶数的回文串,然后再在回文串的两端把剩下的用操作\(1\)补全 而这个偶数长度的回文串可以通过操作\(2\)得到,最终答案就是这个偶数长度的回文串的构造花费加上剩下来的字符的数量 我们构建回文自动机 我们只关心偶数长度回文串的构造花费,假设自动机…
建回文自动机,注意到一个回文串是可以通过一个长度小于等于这个串长度的一半的回文串添上一些字符然后复制得到的,也就是在自动机上向fa走,相当于treedp 每次都走显然会T,记录一个up,指向祖先中最下长度符合要求的回文后缀,这样每次找最多跳一次,所以是O(n)的,还有child的清空动态的做,也就是新建一个点清空一个点 #include<iostream> #include<cstdio> #include<cstring> using namespace std; c…
洛谷_4762:[CERC2014]Virus synthesis 题目描述: 初始有一个空串,利用下面的操作构造给定串\(S\).\(len(S)\leq10^5\) 1: 串开头或末尾加一个字符. 2: 串开头或末尾添加一个该串的逆串. 输入描述: 给出一个\(T\)表示要处理的字符串的数量. 接下来第\(2\)~\(T+1\)行每行给出一个字符串. 输出描述: 对于每一个字符串,输出一个正整数表示答案. 思路: 回文自动机. 先建立一个回文自动机,然后记\(f(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…
CF932G Palindrome Partition(回文自动机) Luogu 题解时间 首先将字符串 $ s[1...n] $ 变成 $ s[1]s[n]s[2]s[n-1]... $ 就变成了求将字符串全部划分为偶回文串的方案数. 建回文树大力跳$ fail $ 直接 $ dp $ 的复杂度是十分优秀的 $ O ( n ^ {2} ) $. 优化不容易想到. 考虑字符串上第 $ j $ 位为结尾的所有回文子串,毫无疑问它们在树上是一条链. 但它有个更重要的性质. 其中所有长度 $ > j…
bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作"反对称"字符串.比如00001111和010101就是反对称的,1001就不是. 现在给出一个长度为N的01字符串,求它有多少个子串是反对称的. 题解时间 这玩意咋看都像是回文串不是嘛. 然后与此同时还是经典计数问题. 所以考虑能不能以这里面的这个规则写个PAM 发现还真能搞:…
Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 用回文自动机来做,如果新添加了一个字符,自动机中新开了一个节点,说明新增加了一个回文串. 对于每新添加一个字符,新增加的回文串数量最多为1. 另外,这道题既卡空间又卡时间,交了n发才过. 参考程序 #include <map> #include <set> #include <s…
Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Description Dima adds letters s 1, -, s n one by one to the end of a word. After each letter, he asks Misha to tell him how many new palindrome substrings…
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; ; + ; typedef long long ll; char st…
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字符串某个前缀的最长回文后缀. 证明. 考虑一个回文串在字符串中第一次出现的位置, 记为 \(S_{p_1 ... p_2}\), 它一定是 \(S_{1 ... p_2}\)的最长回文后缀. 否则, 如果有 \(S_{p_3 ... p_2} (p_3<p_1)\) 也为回文串, 那么由于回文, \…
题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要.拉拉队的选拔工作已经结束,在雨荨和校长的挑选下,n位集优秀的身材.舞技于一体的美女从众多报名的女生中脱颖而出.这些女生将随着篮球队的小伙子们一起,和对手抗衡,为艾利斯顿篮球队加油助威.一个阳光明媚的早晨,雨荨带领拉拉队的队员们开始了排练.n个女生从左到右排成一行,每个人手中都举了一个写有2…
题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的01字符串,求它有多少个子串是反对称的. 输入 第一行一个正整数N (N <= 500,000).第二行一个长度为N的01字符串. 输出 一个正整数,表示反对称子串的个数. 样例输入 8 11001011 样例输出 7 hint 7个反对称子串分别是:01(出现两次), 10(出现两次), 0101,…
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. 样例输入 16 ggabaabaabaaball 样例输出 12 提示 N<=500000 题意就是要求找到一个最长的回文串满足它的一个回文后缀长度是它的一半,也就是在回文自动机的$fail$树上找到一个所代表的回文串的长度为$4$的倍数的点使它有一个祖先所代表的的回文串的长…
题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(transl~l_1~r_1~l_2~r_2\):有两个\(s\)的子串\(s_1=s[l_1\ldots r_1],s_2=s[l_2\ldots r_2]\).你要把\(s_1\)变成\(s_2\).每次允许在左边加一个字符或删一个字符.要求操作次数最少.定义一个字符串是好的当且仅当这个字符串是回文串…
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; int sa[N],rk[N],hei[N],x[N],y[N],c[N]; char s[N]; void Rsort(R n,R m){ for(R i=1;i<=n;++i)++c[x[i]]; for(R i=2;i<=m;++i)c[i]+=c[i-1]; for(R i=n;i;--…
https://www.lydsy.com/JudgeOnline/problem.php?id=2342 解法一: 对原串构建回文自动机 抽离fail树,从根开始dfs 设len[x]表示节点x表示的最长回文子串长度 在fail树上,x到根节点的路径上的点表示的字符串包含了x代表的回文子串的所有回文后缀/前缀 所以若dfs到了x,若len[x]为偶数,标记len[x]*2,如果在x的子树中能找到len为len[x]*2的点,那么len[x]*2*2就可以用来更新答案 #include<cstd…
https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100001 char ss[N]; int s[N]; int L1[N],L2[N]; struct…
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 300001 char ss[N]; int s[N]; ,last; int fail[N],len[N],cnt[N…
这个在翁文涛的论文里有讲到 大概的就是一个子串的回文自动机是原串回文自动机的子图 于是每隔$\sqrt n$重新跑一个$(k \times \sqrt n,n)$的回文自动机 记录回文串个数和位置 并且分别维护后缀的$fail$和前缀的$fail$ 每次询问$(l,r)$只需要把$(k \times\sqrt n,r)$的答案直接加上 再暴力添加$(l,(k \times\sqrt n)-1)$这一段就可以得到$ans$了 只理解了大概 只能以后遇到题再加强了 $update:$新写了一篇$BZ…
2040. Palindromes and Super Abilities 2 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2040 Description Dima adds letters s1, -, sn one by one to the end of a word. After each letter, he asks Misha to tell him how many new palindrome substrings a…