题意:

  DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c。求有多少个位置匹配了t。

分析:

  这个字符串匹配的方式,什么kmp,各种自动机都不灵。

  所以有一个邪门功夫,fft字符串匹配。(做过洛谷《残缺的字符串》一题的应该都不陌生,带通配符的匹配字符串可以用fft卷积来做)

  首先,由于字符集大小只有4,所以我们可以对每个字符分别考虑。

  根据题意,对于每个字符,我们预处理a[i]数组,代表i位置是否能匹配当前字符(左右k个能匹配也算)

  之后b[i]数组,保存t[i]位置的字符是不是c。

  然后将b数组倒过来,fft做一下卷积,把答案累计起来检查总和是不是m就可以判断是否匹配。

代码:

 #include<bits/stdc++.h>
#define db double
#define cp complex<db>
using namespace std;
const int N=;
const db pi=acos(-);
int ans,ton[N],n,m,k,lm,L,r[N];
char s[N],t[N];cp a[N],b[N];
void init(){
scanf("%d%d%d%s%s",&n,&m,&k,s,t);
} void fft(cp *f,int op){
for(int i=;i<lm;i++)
if(i>r[i]) swap(f[i],f[r[i]]);
for(int l=;l<lm;l<<=){
cp wn(cos(pi/l),op*sin(pi/l));
for(int i=;i<lm;i+=(l<<)){
cp w(,);
for(int j=;j<l;j++,w*=wn){
cp T=w*f[i+j+l];
f[i+j+l]=f[i+j]-T;f[i+j]+=T;
}
}
} if(op==-) for(int i=;i<lm;i++) f[i]/=lm;
} void calc(char c){
memset(a,,sizeof(a));memset(b,,sizeof(b));
int cnt=;
for(int i=;i<k;i++) cnt+=(s[i]==c);
for(int i=;i<n;i++){
if(i+k<n) cnt+=(s[i+k]==c);
if(i-k->=) cnt-=(s[i-k-]==c);
a[i]=cnt>?:;cout<<a[i]<<" ";
} for(int i=;i<m;i++) b[i]=(t[i]==c);puts("");
fft(a,);fft(b,);
for(int i=;i<lm;i++) a[i]*=b[i];
fft(a,-);for(int i=;i<=n-m;i++)
ton[i]+=(int)(a[i+m-].real()+0.5);
} void solve(){
for(lm=;lm<=n+m-;lm<<=,L++);
for(int i=;i<lm;i++)
r[i]=(r[i>>]>>)|((i&)<<(L-));
reverse(t,t+m);calc('A');
calc('G');calc('C');calc('T');
for(int i=;i<=n-m;i++) if(ton[i]==m) ans++;
printf("%d\n",ans);
} int main(){
init();solve();return ;
}

fft字符串匹配

CF528D Fuzzy Search 字符串匹配+FFT的更多相关文章

  1. CF528D. Fuzzy Search [FFT]

    CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...

  2. CF-528D Fuzzy Search(FFT字符串匹配)

    Fuzzy Search 题意: 给定一个模式串和目标串按下图方式匹配,错开位置不多于k 解题思路: 总共只有\(A C G T\)四个字符,那么我们可以按照各个字符进行匹配,比如按照\(A\)进行匹 ...

  3. CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串

    Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...

  4. CF528D Fuzzy Search (生成函数+FFT)

    题目传送门 题目大意:给你两个只包含A,G,C,T的字符串$S$,$T$,$S$长$T$短,按照如下图方式匹配 解释不明白直接上图 能容错的距离不超过$K$,求能$T$被匹配上的次数 $S$串同一个位 ...

  5. CF528D Fuzzy Search

    题意:给定k,只含有ACGT的字符串S和T,求T在S中出现了多少次. 字符匹配:如果S的[i - k, i + k]中有字符x,那么第i位可以匹配x. 解: 首先预处理:f[i][j]表示S的第i位能 ...

  6. CF528D Fuzzy Search 【NTT】

    题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...

  7. 【CF528D】Fuzzy Search(FFT)

    [CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...

  8. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  9. 【Codeforces528D】Fuzzy Search FFT

    D. Fuzzy Search time limit per test:3 seconds memory limit per test:256 megabytes input:standard inp ...

随机推荐

  1. rbenv更新ruby后rails命令无效的解决方案

    创建: 2017/11/02 更新: 2018/02/02 增加rbenv使用方法的链接     rbenv的使用: http://www.cnblogs.com/lancgg/p/8281739.h ...

  2. hdoj3665【简单DFS】

    题意: 略. 思路: n就10而已,没有环,搜一下就好了.. #include <bits/stdc++.h> using namespace std; typedef long long ...

  3. Codeforces 快速竞技#4

    快速竞技#4 A–Duff and Meat588A = =这题不知道怎么写题解了.. 直接上code---. #include<bits/stdc++.h> #include<st ...

  4. hihoCoder搜索二·骑士问题

    #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> ...

  5. div倾斜 文字不倾斜

  6. DP+高精度 URAL 1036 Lucky Tickets

    题目传送门 /* 题意:转换就是求n位数字,总和为s/2的方案数 DP+高精度:状态转移方程:dp[cur^1][k+j] = dp[cur^1][k+j] + dp[cur][k]; 高精度直接拿J ...

  7. 474 Ones and Zeroes 一和零

    在计算机界中,我们总是追求用有限的资源获取最大的收益.现在,假设你分别支配着 m 个 0 和 n 个 1.另外,还有一个仅包含 0 和 1 字符串的数组.你的任务是使用给定的 m 个 0 和 n 个 ...

  8. getAttribute()方法的第二个参数

    对于一个img元素,我们想获取它的src属性时可以有两种方式: 1.xxx.getAttribute("src") 2.直接通过xxx.src获取属性值 在src的属性值为相对路径 ...

  9. PDO相关函数

    (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0) PDO::__construct — 创建一个表示数据库连接的 PDO 实例 说明 PDO::__co ...

  10. mybatis javaConfig实现

    @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessio ...