CF528D. Fuzzy Search [FFT]】的更多相关文章

CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][j]\)表示位置i可以匹配字符j 分别考虑每一个字符c,对s的每个位置i求出用\(s[i,i+m-1]\)匹配t,这个字符匹配了几次 用\(a_i=[s的位置i匹配c],\ b_i=[t_i=c]\) 那么c的匹配次数就是\(c_j=\sum\limits_{i=0}^{m-1}a_{j+i}b_i…
Fuzzy Search 题意: 给定一个模式串和目标串按下图方式匹配,错开位置不多于k 解题思路: 总共只有\(A C G T\)四个字符,那么我们可以按照各个字符进行匹配,比如按照\(A\)进行匹配时,当\(k=1\)时,我们将目标串 \(ACAT\)化作 \(1~0~1~0\) 模式串 \(AGCAATTCAT\)化作 \(1~1~1~1~1~1~0~1~1~1\) 同样是反置目标串 可以得到以x为匹配终点的位置的匹配函数\(p(X)=\sum_{i+j=x}A(i)B(j)\) 如此进行…
D. Fuzzy Search time limit per test:3 seconds memory limit per test:256 megabytes input:standard input output:standard output Leonid works for a small and promising start-up that works on decoding the human genome. His duties include solving complex…
Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 S 的字符至少有一个与之相同. 1 ≤ |T| ≤ |S| ≤ 200 000, 0 ≤ k ≤ 200 000.字符串是基因序列. 题解 由于字符集很小,所以对每种字符分别处理. 对 T 每个位置赋值为它是否等于这个字符.对 S 的每个位置前后找找有没有这种字符即可. 然后卷积看看匹配了多少个位…
题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵. 所以有一个邪门功夫,fft字符串匹配.(做过洛谷<残缺的字符串>一题的应该都不陌生,带通配符的匹配字符串可以用fft卷积来做) 首先,由于字符集大小只有4,所以我们可以对每个字符分别考虑. 根据题意,对于每个字符,我们预处理a[i]数组,代表i位置是否能匹配当前字符(左右k个能匹配也算) 之后…
题目传送门 题目大意:给你两个只包含A,G,C,T的字符串$S$,$T$,$S$长$T$短,按照如下图方式匹配 解释不明白直接上图 能容错的距离不超过$K$,求能$T$被匹配上的次数 $S$串同一个位置可以被$T$的不同位置匹配多次 对4种字符分别处理,假设我们现在只讨论字符A 对于字符串AGCAATTCAT,字符A的生成函数就是1001100010 题目要求距离不超过K就能匹配,把周围距离不超过$K$的位置都变成1,形成一个新串$S'$ $S$  1001100010 $S'$ 1111110…
题意:给定k,只含有ACGT的字符串S和T,求T在S中出现了多少次. 字符匹配:如果S的[i - k, i + k]中有字符x,那么第i位可以匹配x. 解: 首先预处理:f[i][j]表示S的第i位能否匹配j.差分一下即可. 然后按照FFT的套路,枚举每种字符,算一遍有多少个匹配.四种字符加起来,如果匹配数等于T的长度,就匹配成功. #include <cstring> #include <cmath> #include <algorithm> #include <…
题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可以匹配该字符,则该位置为\(1\),否则为\(0\) 将\(T\)翻转一下做卷积 如果某个字符意义下的某个位置为\(1\),就说明出现了\(T\)能匹配而\(S\)不能的情况,此时\(T\)不匹配\(S\) 否则\(T\)匹配\(S\) 即寻找有多少位置都为\(0\) #include<algori…
题目链接 \(Descripiton\) 给出文本串S和模式串T和k,S,T为DNA序列(只含\(A,T,G,C\)).对于S中的每个位置\(i\),只要\(s[i-k]\sim s[i+k]\)中有一个位置匹配了字符\(c\),那么就认为\(i\)可以匹配\(c\).求S中有多少位置匹配了T. \(Solution\) 题意一直不很明白..(→_→这就是你颓了一下午一晚上写了一道题的理由?) 匹配当然是连续的,即若位置\(i\)匹配,则\(S[i+j]=T[j]\ (0\leq j<m)\).…
题意:求母串中可以匹配模式串的子串的个数,但是每一位i的字符可以左右偏移k个位置. 分析:类似于 UVALive -4671. 用FFT求出每个字符成功匹配的个数.因为字符可以偏移k个单位,先用尺取法处理出每个位置能够取到的字符.设模式串长度为m. 令\(C(m-1+k) = \sum_{i=0}^{m-1}A_{i+k}*B(m-i-1)\). 反转模式串B, 对每个字符c,若该位上能够取到c,则多项式该位取1,否则为0,FFT求卷积.并记录[m-1,n-1]每个位置4次计算的系数\(C\)之…