CF528D Fuzzy Search
题意:给定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的更多相关文章
- CF528D. Fuzzy Search [FFT]
CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...
- CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...
- CF-528D Fuzzy Search(FFT字符串匹配)
Fuzzy Search 题意: 给定一个模式串和目标串按下图方式匹配,错开位置不多于k 解题思路: 总共只有\(A C G T\)四个字符,那么我们可以按照各个字符进行匹配,比如按照\(A\)进行匹 ...
- CF528D Fuzzy Search 【NTT】
题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...
- CF528D Fuzzy Search 字符串匹配+FFT
题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...
- CF528D Fuzzy Search (生成函数+FFT)
题目传送门 题目大意:给你两个只包含A,G,C,T的字符串$S$,$T$,$S$长$T$短,按照如下图方式匹配 解释不明白直接上图 能容错的距离不超过$K$,求能$T$被匹配上的次数 $S$串同一个位 ...
- 【CF528D】Fuzzy Search(FFT)
[CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...
- CF 528D. Fuzzy Search NTT
CF 528D. Fuzzy Search NTT 题目大意 给出文本串S和模式串T和k,S,T为DNA序列(只含ATGC).对于S中的每个位置\(i\),只要中[i-k,i+k]有一个位置匹配了字符 ...
- 【Codeforces528D】Fuzzy Search FFT
D. Fuzzy Search time limit per test:3 seconds memory limit per test:256 megabytes input:standard inp ...
随机推荐
- 判断浏览器是否支持H5
window.onload = function() { if (!window.applicationCache) { alert("请升级您的浏览器版本,你的浏览器不支持HTML5!&q ...
- RedHat Enterprise Linux 6.4使用yum安装出现This system is not registered to Red Hat Subscription Management
我虚拟机安装的系统是RedHat Enterprise Linux 6.4-i686,是32位的.使用yum命令安装软件时候出现以下错误: This system is not registered ...
- Hbase存储模式
以key.value的结构存储数据; (table,rowkey,family,colum,timestamp)构成数据的key,value存储数据
- windows 安装tensorflow
原文知乎:https://zhuanlan.zhihu.com/p/25778703 前言 看到Rstudio中开始支持Tensorflow,本人是欣喜若狂的,同时TensorFlow官网从16年9月 ...
- How to proof RSA
欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...
- 学习 Spring (十六) AOP API
Spring入门篇 学习笔记 Spring AOP API 是 Spring 1.2 历史用法,现在仍然支持 这是 Spring AOP 基础,现在的用法也是基于历史的,只是更简便了 Pointcut ...
- linux利用CMakeLists编译cuda程序
文件目录: cudaTest |--utils.cu |--utils.h |--squaresum.cu |--squaresum.h |--test.cpp |--CMakeLists.txt 编 ...
- The Xamarin Live Player Unpacked
It is 2017, and it is almost criminal to say that your app doesn't work on a given mobile platform. ...
- DatasourceUtils类:获取连接池和数据库连接
本工具类用于获取连接池和数据库连接 package com.itheima.utils; import java.sql.Connection; import java.sql.ResultSet; ...
- PHP——base64的图片转为文件图片
前言 网上很多,真的是有毒吧,一个那么简单至于写的乱七八糟的嘛,醉了. 代码 具体都写注释中了,不懂的可以评论或者私信我 public function upload() { //接收前台的值 $ba ...