题意:给定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 <cstdio>
const int N = ;
const double pi = 3.1415926535897932384626;
const char ch[] = {'A', 'C', 'G', 'T'};
struct cp
{
double x, y;
cp(double X = , double Y = )
{
x = X;
y = Y;
} inline cp operator +(const cp &w) const
{
return cp(x + w.x, y + w.y);
} inline cp operator -(const cp &w) const
{
return cp(x - w.x, y - w.y);
} inline cp operator *(const cp &w) const
{
return cp(x * w.x - y * w.y, x * w.y + y * w.x);
}
} a[N << ], b[N << ];
int r[N << ], ans[N << ], f[N][], d[N];
char s[N], str[N];
inline void FFT(int n, cp *a, int f)
{
for(int i = ; i < n; i++)
{
if(i < r[i])
{
std::swap(a[i], a[r[i]]);
}
}
for(int len = ; len < n; len <<= )
{
cp Wn(cos(pi / len), f * sin(pi / len));
for(int i = ; i < n; i += (len << ))
{
cp w(, );
for(int j = ; j < len; j++)
{
cp t = a[i + len + j] * w;
a[i + len + j] = a[i + j] - t;
a[i + j] = a[i + j] + t;
w = w * Wn;
}
}
}
if(f == -)
{
for(int i = ; i <= n; i++)
{
a[i].x /= n;
}
}
return;
}
int main()
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
n--;
m--;
scanf("%s%s", s, str);
for(int i = ; i < ; i++)
{
for(int j = ; j <= n; j++)
{
if(s[j] == ch[i])
{
d[std::max(, j - k)]++;
d[std::min(n + , j + k + )]--;
}
}
int now = ;
for(int j = ; j <= n; j++)
{
now += d[j];
if(now)
{
f[j][i] = ;
}
}
memset(d, , sizeof(d));
}
int len = , lm = ;
while(len <= n + m)
{
len <<= ;
lm++;
}
for(int i = ; i <= len; i++)
{
r[i] = (r[i >> ] >> ) | ((i & ) << (lm - ));
}
for(int i = ; i < ; i++)
{
for(int j = ; j <= len; j++)
{
a[j] = b[j] = cp(, );
}
for(int j = ; j <= n; j++)
{
a[j].x = f[j][i];
}
for(int j = ; j <= m; j++)
{
b[m - j].x = (int)(str[j] == ch[i]);
}
FFT(len, a, );
FFT(len, b, );
for(int j = ; j <= len; j++)
{
a[j] = a[j] * b[j];
}
FFT(len, a, -);
for(int j = ; j <= len; j++)
{
ans[j] += (int)(a[j].x + 0.5);
}
}
int temp = ;
for(int i = m; i <= n; i++)
{
if(ans[i] == m + )
{
temp++;
}
}
printf("%d\n", temp);
return ;
}

AC代码

代码乱了,用了CB的格式化,码风可能有点奇怪...

CF528D Fuzzy Search的更多相关文章

  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. CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串

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

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

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

  4. CF528D Fuzzy Search 【NTT】

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

  5. CF528D Fuzzy Search 字符串匹配+FFT

    题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...

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

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

  7. 【CF528D】Fuzzy Search(FFT)

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

  8. CF 528D. Fuzzy Search NTT

    CF 528D. Fuzzy Search NTT 题目大意 给出文本串S和模式串T和k,S,T为DNA序列(只含ATGC).对于S中的每个位置\(i\),只要中[i-k,i+k]有一个位置匹配了字符 ...

  9. 【Codeforces528D】Fuzzy Search FFT

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

随机推荐

  1. easyUI 数据表格datagrid的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. C# Note30: 网络爬虫

    用C#实现网络爬虫(一) 用C#实现网络爬虫(二) 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看) 基于C#.NET的高端智能化网络爬虫(二)(攻破携程网) C#获取网页内容的三种方式

  3. 对于tomcat通过catalina.sh停止服务后,tomcat进程没有退出问题解决办法

    例:tomcat路径及名称为/data/apache-tomcat-7.0.67/ vim /data/apache-tomcat-7.0.67/bin/catalina.sh 找到org.apach ...

  4. sql 用户相关命令

    查看所有用户 select distinct concat(user, '@', host,';') as userList from mysql.user; select  #查找 distinct ...

  5. python好文章

    http://blog.csdn.net/csdnnews/article/details/78557392

  6. react 入坑笔记(四) - React 事件绑定和传参

    React 事件处理 建议:在了解 js 的 this 取值后食用更佳. 一.react 与 Html 中用法的异同和注意点 html 中的绑定事件的写法: <button onclick=&q ...

  7. PCIE\AURORA\SRIO协议对比

    http://www.eefocus.com/communication/335836/p3

  8. Vue获取dom和数据监听

    Vue获取dom对象 在js和jq中我们都能获取dom对象例如 // 获取id=1的div标签 <div id=d1>dom对象</div> // js语法 let ele = ...

  9. BZOJ1449[JSOI2009]球队收益&BZOJ2895球队预算——最小费用最大流

    题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 提示   要求总费用最低 ...

  10. linux下执行sh脚本,提示Command not found解决办法

    1.确保用户对文件有读写及执行权限 oracle@linux-106:~/RMAN/bin> chmod a+x test.sh 2.然后修改文件格式(如果是从winodws搬过来的会显示dos ...