传送门 题目所求为所有的不连续回文子序列个数,可以转化为回文子序列数-回文子串数 回文子串manacher跑一跑就行了,考虑怎么求回文子序列数 我们考虑,如果$S_i$是回文子序列的对称中心,那么只要$S_{i-j}$和$S_{i+j}$相等,我们就多了一种选择 设共有$x$组相等的,那么以$S_i$为对称中心的回文子序列个数就是$2^{x+1}-1$,表示这$x$组包括对称中心选或不选,除去全都不选的都能算入答案 然而对称中心不一定在字符上可能在两个字符中间,那么这种时候回文子序列数就是$2^…
[BZOJ3160]万径人踪灭 Description Input Output Sample Input Sample Output HINT 题解:自己想出来1A,先撒花~(其实FFT部分挺裸的) 做这道题,第一思路很重要,显然看到这题的第一想法就是ans=总数-不合法(不要问我为什么显然).因为向这种用补集法的题一般都会给一些很奇葩的限制条件,但是一旦换个角度去想就很水了,好了不多说废话了. 显然,不合法的情况,也就是连续的回文区间的方案数,我们直接上Manacher就搞定了嘛!答案就是所…
给了两条限制,但是第二条想想是没用的,直接manacher就可以减掉多余的部分了,所以要求满足第一条的方案 也不难,可以想到枚举每个中心点,计算两边有多少对距离中心相等的位置值也相等,假设有\(t\)个,那么以这个中心点为半径的就是\(2^t-1\),因为每个都可以选或不选,减去全都不选的情况 现在就要计算和每个中心点距离相等的位置对数了,显然两个位置\(a,b\)如果值相同,那么中心就是\((a+b)/2\)(如果是小数的话就是两个格子之间的) 所以就简单了,\(A(i)=[S[i]='a']…
题目链接 之前做很早了没写这篇,补上. 记录当前ex[]最大的回文中心id和最远延伸范围mx! 关于串的构造: 应该是 @ #A#B#C#B#A# $ ,而不是 @ A#B#C#B#A $ 比如 @a#b#b#c$,答案应是\(max\{ex[i]\}-1\),而第二种很多情况下答案是\(max\{ex[i]\}\). 最优解不改串分奇偶讨论感觉sxbk..其实也没什么 #include <cstdio> #include <cstring> #include <algori…
题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg_{i-j}+\sum_{j=mid+1}^rf_jg_{i-j}\] 复杂度\(O(n\log^2n)\). 分治思路见:https://www.cnblogs.com/SovietPower/p/9366763.html 多项式求逆做法先坑着. //693ms 4.91MB #include <…
题面 这是CDQ入门题,不要被题目名骗了,这核心根本不在不在FFT上啊=.= 因为后面的项的计算依赖于前面的项,不能直接FFT.所以用CDQ的思想,算出前面然后考虑给后面的贡献 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,mod=; *N],b[*N],rev[*N],f[N],g[N],n,G,Gi; void exGCD(int a,int b,int &a…
题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格式: 一个整数表示答案 输入输出样例 输入样例#1: aaa 输出样例#1: 3 说明 字符串长度len <= 11000000 分析:manacher算法模板,算法分析就不具体讲了,five20大佬讲的挺好的,可以参照一下他的博客. Code: #include<bits/stdc+…
新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_n=\sum\limits_{i=0}^n A_iB_{n-i} \] 基本思路为先将系数表达 -> 点值表达 \(O(nlogn)\) 随后点值 \(O(n)\) 进行乘法运算 最后将点值表达 -> 系数表达 \(O(nlogn)\) 代码 #include<cstdio> #inc…
题目:https://www.luogu.org/problemnew/show/P4721 分治做法,考虑左边对右边的贡献即可: 注意最大用到的 a 的项也不过是 a[r-l] ,所以 NTT 可以只做到 2*(r-l),能快一倍. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long…
[BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关于这个位置对称的位置的组数 就很容易算了(直接\(2^k-1\)) 而关于这个位置对称是什么东西? \(s[x-i]=s[x+i]\) 也就是说,如果两个位置关于\(x\)位置对称,那么 \((x-i)+(x+i)=2x\) 也就是两个位置的坐标的和等于\(2x\) 这个玩意不就像一个卷积卷积了?…