题意:给定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. vue的定位

    高德定位 https://blog.csdn.net/YY110621/article/details/87921605(copy) 话不多说,直接写方法步骤,需要的直接拿去放在自己项目中即可使用先看 ...

  2. 剑指offer(13)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 判断当前两个根结点是否相等,如果相等,判断左右子树是否相等,如果不依次判断左右子树是否满足上 ...

  3. java 中Excel的导入导出

    部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字  的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...

  4. 解决mybatis generator警告Cannot obtain primary key information from the database, generated objects may be incomplete

    使用 mybatis generator 生成pojo.dao.mapper时 经常出现 Cannot obtain primary key information from the database ...

  5. chrome中 GET /undefined 404

    Chrome中调试网站,会出现 这是由 crxMouse Chrome™ 手势 引起的,关闭即可

  6. ECS配置lamp环境

    1.安装apache 1.1 安装apache [root@nmserver-7 ~]# yum install httpd httpd-devel 1.2 启动apache服务 [root@nmse ...

  7. NC部门考勤月报定制sql

    SELECT t_1.pk_psndoc pk_psndoc, t_1.pk_group pk_group, t_1.pyear pyear, t_1.month month, t_1.code ps ...

  8. hdu-1251(字典树)

    字典树模板题. ps:数组要开大,40w左右才行,不然疯狂re 代码: #include<iostream> #include<algorithm> #include<c ...

  9. Sql Server设置主键和外键

    设置主键 https://jingyan.baidu.com/article/9158e0003349a7a2541228fd.html 设置外键 https://jingyan.baidu.com/ ...

  10. Spring01-Ioc基本使用

    一. Spring简介 1. Spring介绍 Spring框架主页: Spring官网 Spring资源地址:下载地址 Spring框架,由Rod Johnson开发 Spring是一个非常活跃的开 ...