题意:给定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. java日志框架之logback(一)——logback工程简介

    Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...

  2. scala下划线

    作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...

  3. Linux基础学习(12)--Linux服务管理

    第十二章——Linux服务管理 一.服务简介与分类 1.服务的分类: 注:独立的服务放在内存中(好处:响应的速率快,坏处:独立的服务越多,耗费的内存资源越多):xinetd服务本身是独立的,在内存中, ...

  4. 如何建立一个WCF服务并将其发布到IIS上

    在我们的软件开发中,经常会连接到数据库中,如果是常规的操作,我们经常会将连接数据库的字符串写在配置文件中,然后去读取数据库的连接字符串,其实这种方式是非常不科学的,这会直接暴露我们的数据库,直接暴露我 ...

  5. 2.23日刷数论题后总结(题目整理自SCUT

    第一道:Rightmost digit 求N^N次最后一个数字 快速幂mod10咯 代码如下: #include <cstdio> #define ll long long using n ...

  6. codeforces493B

    Vasya and Wrestling CodeForces - 493B Vasya has become interested in wrestling. In wrestling wrestle ...

  7. 基于jQuery-ui实现多滑块slider

    效果图: 代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...

  8. Photoshop独立安装包下载页面

    下载页面地址:https://helpx.adobe.com/cn/creative-cloud/kb/creative-cloud-apps-download.html

  9. Mysql partition by

    一,看原表 select * from `user`; 二,查询同组年级最大的 select username ,SUBSTRING_INDEX( GROUP_CONCAT(age order by ...

  10. BZOJ2554 color 【概率DP】【期望DP】

    题目分析: 好题. 一开始看错题了,以为是随机选两个球,编号在前的染编号在后的. 但这样仍然能获得一些启发,不难想到可以确定一个颜色,剩下的颜色是什么就无关了. 那么答案就是每种颜色的概率乘以期望.概 ...