Luogu4199 万径人踪灭 FFT、Manacher】的更多相关文章

传送门 先不考虑”不是连续的一段“这一个约束条件.可以知道:第$i$位与第$j$位相同,可以对第$\frac{i+j}{2}$位置上产生$1$的贡献(如果$i+j$为奇数表明它会对一条缝产生$1$的贡献),而每一个位置上或缝上的满足条件的字符串的个数就是$2^\text{贡献}-1$.把$\frac{1}{2}$忽略掉,也就是说:第$i$位与第$j$位相同时会在第$i+j$位产生$1$的贡献.这个是经典的生成函数+$FFT$求解的问题.具体来说,将$a,b$两个字母分开计算,以计算$a$的贡献为…
3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为对称轴) f[i],i为奇数表示以缝隙对称,偶数表示以元素i>>1对称,对答案的贡献就是\(2^{f[i]}-1\) \[ f[i] = \sum_{j=1}^{i-1} [s_j = s_{i-j}] \] 就是裸卷积 因为只有a,b两个字符,可以先后令a或b=1分别求 #include <…
Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{i=0}^{n-1}2^{f[i]-1}$ 构造两个数组$a[i],b[i]$.若第$i$位为$a$,那么$a[i]=1$,否则$b[i]=1$. 可以发现$a$数组自身卷积就是$a$字母对$f$数组的贡献,$b$数组同理. 卷下$a$,卷下$b$,对应位置求和,就是$f$数组. 因为在卷积中每对对…
\(\color{#0066ff}{ 题目描述 }\) \(\color{#0066ff}{输入格式}\) 一行,一个只包含a,b两种字符的字符串 \(\color{#0066ff}{输出格式}\) 一行,一个整数表示问题的答案 \(\color{#0066ff}{输入样例}\) abaabaa aaabbbaaa aaaaaaaa \(\color{#0066ff}{输出样例}\) 14 44 53 \(\color{#0066ff}{数据范围与提示}\) \(\color{#0066ff}{…
BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如x是对称轴,若 i 和 j 是对称且di=dj,i,j可以视为可行的一组.可行组数记为f[x]. \(f[x]=\sum_{i=1}^{x-1}[d[x-i]==d[x+i]]\) 以x为对称轴的答案是2^(f[x])-1. 可以观察发现将d[i]=1的A[i]标为1,A与A做一次卷积,即可得出d[…
题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\(f[i]\)表示以i位置为中心的对称的字符对数,那么i位置产生的回文子序列数 = \(2^{f[i]} - 1\) 如何求? 由对称的性质,以i为对称中心的两点\(a,b\)满足\(a+b=2*i\) 我们可以设一个这样的序列: \(c[n]\)表示以\(n/2\)位置为对称点的对称点对数[n/2若…
传送门 这题--我觉得像我这样的菜鸡选手难以想出来-- 题目要求求出一些子序列,使得其关于某个位置是对称的,而且不能是连续一段,求这样的子序列的个数.这个直接求很困难,但是我们可以先求出所有关于某个位置对称的子序列,最后减去子串的个数. 子串个数可以用\(manacher\)求,至于子序列的话,我们假设以第\(i\)位为中心,那么如果两边有\(x\)对相同的字符,那么这个位置对答案的贡献就是\(2^x-1\)或者\(2^(x+1)-1\).(因为有可能回文串的长度是偶数,也就是不存在中间点) 考…
考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f[i]为下标和为i的对称中心一共有多少对相同字符,这样总答案就是\( \sum_{i=0}^{2*n-2}2^{f[i]}-1 \)(减掉的1是减掉空集) 然后考虑f怎么求,\( f[i]=((\sum_{j=0}^{i-1}s[j]==s[i-j])+1)/2 \),除2是因为每一对都被算了两遍…
传送门 题目所求为所有的不连续回文子序列个数,可以转化为回文子序列数-回文子串数 回文子串manacher跑一跑就行了,考虑怎么求回文子序列数 我们考虑,如果$S_i$是回文子序列的对称中心,那么只要$S_{i-j}$和$S_{i+j}$相等,我们就多了一种选择 设共有$x$组相等的,那么以$S_i$为对称中心的回文子序列个数就是$2^{x+1}-1$,表示这$x$组包括对称中心选或不选,除去全都不选的都能算入答案 然而对称中心不一定在字符上可能在两个字符中间,那么这种时候回文子序列数就是$2^…
容易想到先统计回文串数量,这样就去掉了不连续的限制,变为统计回文序列数量. 显然以某个位置为对称轴的回文序列数量就是2其两边(包括自身)对称相等的位置数量-1.对称有啥性质?位置和相等.这不就是卷积嘛.那么就做完了. 又写挂manacher,没救. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<…
万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1936  Solved: 1076[Submit][Status][Discuss] Description Input Output   Sample Input   Sample Output   HINT 题目大意:给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数 首先回文一定是将字符串倍增 由于求的是不连续回文子序列的个数 因此我们可以求出总回文子序列的个数,然后减…
[题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算法(Manacher,PAM,二分+hash)轻松计算. 设f[i]表示以i为对称中心的对称字符对数,那么 i 对答案的贡献是$2^{f[i]}-1$,同时容易列出f[i]的计算公式: $$f[i]=\sum_{j=0}^{i}[S_j=S_{2i-j}]$$ 令a=0,b=1,那么有: $$f[i]=\…
思路: 这道题思路好奇怪--. 我们先要知道关于x (x可以是间隙) 对称的有几对字母 显然暴力是n^2的 那怎么办呢 先把所有'a'看成1 'b'看成0 意外的发现 这不就是卷积嘛 再倒过来搞一搞 加一下 2^x-1就是包含连续的回文串的解了 然后 跑个manacher 把包含的删掉就好啦 时间复杂度是O(nlogn)的 代码: //By SiriusRen #include <cstdio> #include <complex> #include <cstring>…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #define inf 1000000000 #define ll long long #define N 200005 #define mod 1000000007 using namespace std; int read(){ ,f=;char ch=getchar(); ;ch=getchar();} +c…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 似乎理解加深了. 用卷积算相同的位置:先把 a 赋成1. b 赋成0,卷积一遍:再把 a 赋成0. b 赋成1,卷积一遍:两个加起来就有了每个位置的值,它表示以该位置/2(/2的位置可以是裂缝)为对称轴的回文位置个数. 然后用马拉车把连续区间的情况去掉. 注意一下单个元素也要算上,因为有那种奇数的:马拉车里别忘了把单个元素减去. 因为FFT的两个数组是一样的,所以FFT一次,然后自己…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^f[i] - 1: 然后减去连续的,用 manachar 求出回文长度,每个位置作为边界都是一种不合法情况: 求对称,首先把字符串中间穿插字符 '$',于是字符串的长度变成2倍: 考虑一对字母 s[x],s[y],如果 s[x] = s[y],其对称中心是 (x+y)/2: 放在加入字符后的字符串中…
Description 一个ab串,问有多少回文子序列,字母和位置都对称,并且不连续. Sol FFT+Manacher. 不连续只需要减去连续的就可以了,连续的可以直接Manacher算出来. 其他全部对称的回文子序列就可以用生成函数那样FFT搞出来,把ab分开考虑就行. 有挺多细节的...包括下标运算什么什么的... Code /************************************************************** Problem: 3160 User:…
fft+manacher fft都快忘了... 其实我们发现,这个问题是可以用fft做的,因为是回文子序列,所以我们直接自己和自己求卷积,然后扫描每个位置,注意是每个位置,因为包括奇数长度和偶数长度,f[i]为第i个位置上的对称字符的数量,那么一共就有(2^f[i])-1个回文子序列,因为是要不连续的,所以用manacher求出连续的就行了 #include<bits/stdc++.h> using namespace std; typedef long long ll; , mod = ;…
[BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关于这个位置对称的位置的组数 就很容易算了(直接\(2^k-1\)) 而关于这个位置对称是什么东西? \(s[x-i]=s[x+i]\) 也就是说,如果两个位置关于\(x\)位置对称,那么 \((x-i)+(x+i)=2x\) 也就是两个位置的坐标的和等于\(2x\) 这个玩意不就像一个卷积卷积了?…
[BZOJ3160]万径人踪灭 Description Input Output Sample Input Sample Output HINT 题解:自己想出来1A,先撒花~(其实FFT部分挺裸的) 做这道题,第一思路很重要,显然看到这题的第一想法就是ans=总数-不合法(不要问我为什么显然).因为向这种用补集法的题一般都会给一些很奇葩的限制条件,但是一旦换个角度去想就很水了,好了不多说废话了. 显然,不合法的情况,也就是连续的回文区间的方案数,我们直接上Manacher就搞定了嘛!答案就是所…
前言 多项式真的很难♂啊qwq Solution 考虑求的是一个有间隔的回文串,相当于是: 总的答案-没有间隔的答案 考虑总的答案怎么计算?FFT卷一下就好了. 对于每一位字符,有两种取值,然后随便卷起来,卷起来就是当前这一位之前与它相同的字符个数(这一位不能是'0',也就是被排斥的那一位) 然后就可以轻松解决? 是的. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h&…
3160: 万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 133  Solved: 80[Submit][Status][Discuss] Description Input Output   Sample Input   Sample Output   HINT 以每一个位置为中心,分别处理连续一块的回文串,回文序列个数. 比较容易看出是FFT+manachar,但是FFT还是不太熟悉,特别要注意三层for语句中i,j,k不能写错,…
3160: 万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1440  Solved: 799 Description Input Output Sample Input Sample Output HINT Source 2013湖北互测week1 [分析] 看题目被吓死,其实很多废话.. 还是自己想出来了..FFT好强啊..可以加速很多东西的说. 然后就是,枚举对称轴吧? 假设a[i]==a[j],那么用i+j表示它的对称轴. 共有…
[题目大意] 在一个仅仅含有a,b的字符串里选取一个子序列,使得: 1.位置和字符都关于某条对称轴对称: 2.不能是连续的一段. [思路] 不连续的回文串的个数=总的回文串个数-连续回文串的个数. 后者可以用manacher在O(n)时间里面求出.求的是个数不是最长串,和之前写的几道不怎么一样,注意一下. 求总的回文串个数稍微复杂一些.我们用f[i]表示以i为对称中心,两边有多少个对称的字符.对于每个中心i我们有(2^f[i])-1种方案 答案即Σ[1<=i<=n*2+1]((2^f[i])-…
原文链接http://www.cnblogs.com/zhouzhendong/p/8810140.html 题目传送门 - BZOJ3160 题意 给你一个只含$a,b$的字符串,让你选择一个子序列,使得: $1.$位置和字符都关于某一条对称轴对称. $2.$不能是连续的一段. 问原来的字符串中能找出多少个这样的子序列.答案对$10^9+7$取模. 串长$\leq 10^5$. 题解 下面的讨论都在满足条件$1$的情况下进行. 首先,我们先不考虑条件$2$.然后再减掉不满足条件$2$的就可以了…
..恩 打了四五遍 不会也背出来了.. BZOJ3160 [听说时限紧?转C++的优势么?] 上AC代码 fft /*Problem: 3160 User: cyz666 Language: C++ Result: Accepted Time:1992 ms Memory:18492 kb ****************************************************************/ #include <bits/stdc++.h> #define LL l…
BZOJ传送门: 解题思路: FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了. (回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹配). 最后利用容斥回文字符2的次幂-回文串就好了. 回文串计数当然要回文自动机了. 代码: #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> typedef long…
[bzoj3160]万径人踪灭 题意 给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数. \(n\leq 100000\) 分析 还是蛮不错的. 这道题基本上是自己想到的. 除了没有利用到'a'和'b'只有两个不同字符的特性. 求不连续回文子序列的个数. 首先问题可以进行转化: 根据容斥原理,用任意回文子序列的个数(1)-连续回文子序列(2)的个数. 问题(2),即连续回文子序列的个数,用Manacher很容易求出来. 所以现在考虑解决问题(1):任意回文子序列的个数. 我们的想法…
题目1 COGS 很强的乘法问题 高精度乘法用FFT加速 #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #define Pi acos(-1) using namespace std; + ; ; struct Complex { double r, i;…
目录 信号, 集合, 多项式, 以及卷积性变换 卷积 卷积性变换 傅里叶变换与信号 引入: 信号分析 变换的基础: 复数 傅里叶变换 离散傅里叶变换 FFT 与多项式 \(n\) 次单位复根 消去引理, 折半引理与求和引理 重新定义 多项式的表示 快速傅里叶变换FFT 通过 FFT 在单位复数根处插值 FFT的速度优化与迭代实现 炸精现场与 NTT 原根 NTT 任意模数 NTT 卷积状物体与分治 FFT FWT 与位运算卷积 FWT 与 \(\text{or}\) 卷积 FWT 与 \(\te…