题意:给定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. Angular 基本指令

    <!DOCTYPE html><html ng-app><head lang="en"> <meta charset="UTF- ...

  2. java中级——集合框架【1】-ArrayList

    集合框架----ArrayList 引子:我们先来看看传统数组的用法 写一个Hero对象类 package cn.jse.t1; public class Hero { public String n ...

  3. mycat - 全局序列

    解决主键冲突问题:例如id自增的order表,如果分布式情况下不处理的话,当每个表的第一条数据id都是1. 怎么确保id唯一呢? 解决办法: 1.本地文件(不推荐) 2.数据库方式(推荐) 3.时间戳 ...

  4. redis 中主从、哨兵和集群分片模式这三个有什么区别 ?

    集群分片 比如 5主5从,也就是说 数据过来之后会均匀的分配到5台服务器上面,5台服务器上面的数据是不同的,但是每个服务器都有一个从服务器,上面的数据跟这一台主服务器的数据是一样的: 也就是说,对于这 ...

  5. cmd & tree & bash

    cmd & tree & bash bug E: Unable to locate package tree solution # 1. update $ sudo apt-get u ...

  6. 使用JAVA获取JSON报文

    基本JSON格式: { "name": "liming", "age": "13", "array" ...

  7. js定时函数,定时改变字体的大小

    <html> <head> </head> <body> <div id="d"> js控制字体大小 </div& ...

  8. SQL Server 2008 开启远程连接

    除了 IP1.IP2 外,也要把 IPALL 的端口也设置为 1433 参考:SQL Server开启1433端口,彻底解决方案

  9. Announcing Windows Template Studio in UWP

    今天,我们很高兴地宣布您的文件→新的通用Windows平台应用程序在Visual Studio - Windows模板工作室中的下一个演变.Windows Template Studio在开发人员调查 ...

  10. codeforces493B

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