51nod 1565模糊搜索(FFT)】的更多相关文章

题目大意就是字符串匹配,不过有一个门限k而已 之前有提到过fft做字符串匹配,这里和之前那种有些许不同 因为只有A,C,G,T四种字符,所以就考虑构造4个01序列 例如,模板串a关于'A'的01序列中,1代表这个位置可以匹配,而0则代表不能匹配. 这样构造出4个序列后,再对匹配串b做同样的处理 下面用a['A']代表a关于'A'的01序列,b同理 然后可以知道a['A'][i]&b['A'][i]如果是1则代表可以匹配,如果是0则代表不能匹配. 那么在位置i两个串能否匹配就可以写做 for(x…
这...好强啊\(QwQ\) 思路:卷积?\(FFT\)? 提交:\(5\)次 错因:一开始的预处理写错了(竟然只错了最后几个大点)闹得我以为\(FFT\)写挂了\(QwQ\) 题解: 对四种字符分开考虑:我们设\(a[char][i]\)表示在第一个串\(s\)中,对于\(char \in \{'A','C','G','T'\}\)来说\(i\)位置是否能模糊匹配,换言之,若\(s[i]==char\),则\(a[char][j]=1,j\in [i-k,i+k]\). 而对于第二个串\(t\…
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1565&noticeId=445588 有两个基因串S和T,他们只包含AGCT四种字符.现在你要找出T在S中出现了几次. 有一个门限值k≥0.T在S的第i(1≤i≤|S|-|T|+1)个位置中出现的条件如下:把T的开头和S的第i个字符对齐,然后T中的每一个字符能够在S中找到一样的,且位置偏差不超过k的,那么就认为T在S的第i个位置中出现.也就是说对于所有的 j (1≤j≤|…
题解 这个字符集很小,我们可以把每个字符拿出来做一次匹配,把第一个字符串处理每个出现过的该字符处理成一个区间加,即最后变成第一个字符串的该位置能够匹配某字符 例如对于样例 10 4 1 AGCAATTCAT ACAT 我们做A的时候,把第一个串处理成 AAAAAA00AA0 第二个串 A0A0 那么就变成第二个串从第一个串每个位置开始能不能匹配上第二个串所有的A了 我们发现把第二个串反序之后和第一个串求一个卷积,那么第一个串每个位置如果系数等于第二个串该字符出现次数,那么证明这个位置可以匹配一个…
题目链接  51nod 算法马拉松 34  Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$,满足$1 <= i <= j <= n$ 我们考虑这个点对对答案的贡献. 首先显然$i$和$j$必须有相同的奇偶性,那么$i + j$一定为偶数. 包含这个点对的有效的质数的区间长度为$[j - i + 1, min(i + j - 1, 2n + 1 - i - j)]$中的所有质数.…
题目链接:51Nod 传送门 没压位,效率会低一点 1.FFT #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int MAXN = 1<<18; const double Pi = acos(-1.0); struct complex { double r, i; complex(doubl…
1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50000\) 等幂求和 多项式求逆元\(O(mlogm)\)预处理伯努利数,然后可以\(O(m)\)回答 因为是任意模数,所以要用拆系数fft 拆系数fft+多项式求逆元,写的爽死了 具体内容可能会写学习笔记 注意: 多项式求逆元里拆系数,不能只更新 .x= ,这样的话y还保留以前的值就错了 因为使用…
卡精度的任意模数fft模板题……这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.然后我就去网上抄了一下板子……我打的是最土的任意模数fft,就是fft7次的那种……(好像有很多方法的样子……)这种任意模数fft方法见http://blog.csdn.net/l_0_forever_lf/article/details/52886397这道题的具体做法见http://blog.csdn.net/qq_33229466/article…
题目链接 模板题.. #include<bits/stdc++.h> using namespace std; typedef int LL; typedef double db; namespace FFT //使用前需要用 fft_init()函数 初始化 { <<; .14159265358979323846264338327950288L; struct cp { db a,b; cp(,) { a=a_,b=b_; } cp operator +(const cp&…
打开51Nod全部问题页面,在右边题目分类中找到快速傅里叶变换,然后按分值排序,就是本文的题目顺序. 1.大数乘法问题 这个……板子就算了吧. 2.美妙的序列问题 长度为n的排列,且满足从中间任意位置划分为两个非空数列后,左边的最大值>右边的最小值.问这样的排列有多少个%998244353. 多组询问,n,T<=100000. 题解:经过分析可知,不合法的排列一定存在这样一种划分: 我们考虑答案=f[i]=i!-不合法排列个数. 形如 2 1 3 4 6 5 这种排列,会有三种划分方式不合法(…