链接:codeforces 528D

正解:$FFT$。

很多字符串匹配的问题都可以用$FFT$来实现。

这道题是要求在左边和右边$k$个字符内有字符和模式串匹配,那么用$kmp$是显然不行的。我们考虑把模式串翻转一下。因为只有4个字符,所以每个字符我们分开考虑。然后对于母串,如果在给定范围内有当前字符,这个位置就赋值为1;对于模式串,如果当前位置是当前字符,这个位置就赋为1。然后我们对这两个多项式做一下卷积,记录$Ans$,最后4种字符的$Ans$求和如果等于$m$,那么这个位置就是匹配的。

 //It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define pi acos(-1)
#define inf (1<<29)
#define NN (1000010)
#define il inline
#define RG register
#define ll long long
#define C complex <double>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; int ans[NN],rev[NN],n,m,k,N,M,lg,pos,res;
char s[NN],t[NN],fg[]="AGCT";
C a[NN],b[NN]; il int gi(){
RG int x=,q=; RG char ch=getchar(); while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar(); while (ch>='' && ch<='') x=x*+ch-,ch=getchar(); return q*x;
} il void fft(C *a,RG int n,RG int f){
for (RG int i=;i<n;++i) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (RG int i=;i<n;i<<=){
C wn(cos(pi/i),sin(f*pi/i)),x,y;
for (RG int j=;j<n;j+=(i<<)){
C w(,);
for (RG int k=;k<i;++k,w*=wn){
x=a[j+k],y=w*a[j+i+k];
a[j+k]=x+y,a[j+i+k]=x-y;
}
}
}
return;
} il void work(){
n=gi(),m=gi(),k=gi(); scanf("%s%s",s,t); reverse(t,t+m);
M=n+m; for (N=;N<=M;N<<=) lg++;
for (RG int i=;i<=N;++i) rev[i]=(rev[i>>]>>)|((i&)<<(lg-));
for (RG int p=;p<;++p){
memset(a,,sizeof(a)),memset(b,,sizeof(b));
pos=-inf;
for (RG int i=;i<n;++i){
if (s[i]==fg[p]) pos=i;
if (i-pos<=k) a[i]=;
}
pos=inf;
for (RG int i=n-;i>=;--i){
if (s[i]==fg[p]) pos=i;
if (pos-i<=k) a[i]=;
}
for (RG int i=;i<m;++i) if (t[i]==fg[p]) b[i]=;
fft(a,N,),fft(b,N,); for (RG int i=;i<N;++i) a[i]*=b[i];
fft(a,N,-); for (RG int i=;i<N;++i) ans[i]+=(int)(a[i].real()/N+0.5);
}
for (RG int i=;i<N;++i) if (ans[i]==m) res++; printf("%d",res); return;
} int main(){
File("fuzzy");
work();
return ;
}

codeforces 528D Fuzzy Search的更多相关文章

  1. CodeForces 528D Fuzzy Search 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8782849.html 题目传送门 - CodeForces 528D 题意 给你两个串$A,B(|A|\geq| ...

  2. Codeforces 528D Fuzzy Search(FFT)

    题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...

  3. ●codeforces 528D Fuzzy Search

    题链: http://codeforces.com/problemset/problem/528/D 题解: FFT 先解释一下题意: 给出两个字符串(只含'A','T','C','G'四种字符),一 ...

  4. Codeforces.528D.Fuzzy Search(FFT)

    题目链接 \(Descripiton\) 给出文本串S和模式串T和k,S,T为DNA序列(只含\(A,T,G,C\)).对于S中的每个位置\(i\),只要\(s[i-k]\sim s[i+k]\)中有 ...

  5. 2019.01.26 codeforces 528D. Fuzzy Search(fft)

    传送门 fftfftfft好题. 题意简述:给两个字符串s,ts,ts,t,问ttt在sss中出现了几次,字符串只由A,T,C,GA,T,C,GA,T,C,G构成. 两个字符匹配的定义: 当si−k, ...

  6. CodeForces - 528D Fuzzy Search (FFT求子串匹配)

    题意:求母串中可以匹配模式串的子串的个数,但是每一位i的字符可以左右偏移k个位置. 分析:类似于 UVALive -4671. 用FFT求出每个字符成功匹配的个数.因为字符可以偏移k个单位,先用尺取法 ...

  7. CF 528D. Fuzzy Search NTT

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

  8. 【codeforces 528D】 Fuzzy Search

    http://codeforces.com/problemset/problem/528/D (题目链接) 题意 给定母串和模式串,字符集大小为${4}$,给定${k}$,模式串在某个位置匹配当且仅当 ...

  9. CF528D. Fuzzy Search [FFT]

    CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...

随机推荐

  1. Leetcode_001_TwoSum_求和为固定数的两个数的索引

    题目描述    给定一个整型数组,在数组中找出两个数使这两个数的和为给定数,从小到大输出这两个数在数组中的位置(我们可以假定输出结果只有一个).例如,输入:N={1,4,8,20}, target=1 ...

  2. mysql编程--创建函数出错的解决方案

    本文章转载自:http://www.jb51.net/article/71100.htm 在使用MySQL数据库时,有时会遇到MySQL函数不能创建的情况.下面就教您一个解决MySQL函数不能创建问题 ...

  3. (11)连个工具类之间的比较4.Collections与Arrays

    集合框架中的工具类:特点:该工具类中的方法都是静态的. Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key) ...

  4. SQL Server--获取磁盘空间使用情况

    对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: -- 查看磁盘可 ...

  5. Mac系统安装nginx+rtmp模块

    1.安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ...

  6. shell中的readonly

    readonly用来定义只读变量,一旦使用readonly定义的变量在脚本中就不能更改 测试脚本 #!/bin/sh readonly a='haha' echo a a='xixi' //更改变量的 ...

  7. Sublime Text 3常用插件

    操作:按下Ctrl+Shift+P调出命令面板 输入install 调出 Install Package 选项并回车,然后在列表中选中要安装的插件. 常用插件: 1---- Bracket Highl ...

  8. js两个判断&&的值与||的值

    var value1="val1"; var value2="val2"; alert(value1&&value2);    //结果为val ...

  9. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  10. GDOI2014模拟pty爬山(mountain)

    pty爬山(mountain) 在Pty学校附近,有一座名之为岳之麓的高山.Pty很喜欢和(哔--)一起爬山.山的平面模型如下:山由一个顶点集:A1,A2-An给定,保证Ai的x单调递增.我们将Ai和 ...