思路:

显然拆位FFT 不解释

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
const double pi=acos(-);
int n=,L,S,T,k,sa[N],st[N],sc[N],sg[N],R[N],csa,cst,csc,csg,ans;
char s[N],t[N],A[N];
struct Complex{double x,y;Complex(){}Complex(double X,double Y){x=X,y=Y;}}Sa[N],St[N],Sc[N],Sg[N],Ta[N],Tt[N],Tc[N],Tg[N];
Complex operator+(Complex a,Complex b){return Complex(a.x+b.x,a.y+b.y);}
Complex operator-(Complex a,Complex b){return Complex(a.x-b.x,a.y-b.y);}
Complex operator*(Complex a,Complex b){return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
Complex operator/(Complex a,int b){return Complex(a.x/b,a.y/b);}
void FFT(Complex *a,int f){
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int l=;l<n;l<<=){
Complex wn=Complex(cos(pi/l),f*sin(pi/l));
for(int j=;j<n;j+=(l<<)){
Complex w=Complex(,);
for(int k=;k<l;k++,w=w*wn){
Complex X=a[j+k],Y=w*a[j+k+l];
a[j+k]=X+Y,a[j+k+l]=X-Y;
}
}
}if(f==-)for(int i=;i<n;i++)a[i]=a[i]/n;
}
int main(){
scanf("%d%d%d%s%s",&S,&T,&k,s+,t+);
for(;n<=S+T;n<<=)L++;
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));
for(int i=;i<=S;i++){
if(s[i]=='A')sa[max(,i-k)]++,sa[i+k+]--;
else if(s[i]=='T')st[max(,i-k)]++,st[i+k+]--;
else if(s[i]=='C')sc[max(,i-k)]++,sc[i+k+]--;
else if(s[i]=='G')sg[max(,i-k)]++,sg[i+k+]--;
}
for(int i=;i<=S;i++)sa[i]+=sa[i-],st[i]+=st[i-],sc[i]+=sc[i-],sg[i]+=sg[i-];
for(int i=;i<=T;i++){
if(t[i]=='A')Ta[T-i]=Complex(,),csa++;
else if(t[i]=='T')Tt[T-i]=Complex(,),cst++;
else if(t[i]=='C')Tc[T-i]=Complex(,),csc++;
else if(t[i]=='G')Tg[T-i]=Complex(,),csg++;
}
for(int i=;i<=S;i++){
if(sa[i])Sa[i-]=Complex(,);
if(st[i])St[i-]=Complex(,);
if(sc[i])Sc[i-]=Complex(,);
if(sg[i])Sg[i-]=Complex(,);
}
FFT(Sa,),FFT(St,),FFT(Sc,),FFT(Sg,),FFT(Ta,),FFT(Tt,),FFT(Tc,),FFT(Tg,);
for(int i=;i<n;i++)Sa[i]=Sa[i]*Ta[i];
for(int i=;i<n;i++)St[i]=St[i]*Tt[i];
for(int i=;i<n;i++)Sc[i]=Sc[i]*Tc[i];
for(int i=;i<n;i++)Sg[i]=Sg[i]*Tg[i];
FFT(Sa,-),FFT(St,-),FFT(Sc,-),FFT(Sg,-);
for(int i=;i<S;i++)A[i]=;
for(int i=;i<S;i++)
if((int)(Sa[i+T-].x+0.2)!=csa||(int)(St[i+T-].x+0.2)!=cst||(int)(Sc[i+T-].x+0.2)!=csc||(int)(Sg[i+T-].x+0.2)!=csg)A[i]=;
for(int i=;i<S;i++)if(A[i])ans++;
printf("%d\n",ans);
}

最新文章

  1. Cookie案例:简单登录界面中的应用
  2. PeCheck
  3. Apache Shiro 简介
  4. mac在xampp下使用yii2.0开发环境配置
  5. Programming with gtkmm 3
  6. PHPthinking官方论坛
  7. 第一章 自定义MVC框架
  8. mongodb远程连接配置
  9. 简述Apache的ab测试主要有那些关键指标
  10. 小白学PYTHON时最容易犯的6个错误,看看你遇到过几个
  11. php+mysql+nginx+liunx 服务搭建
  12. Leetcode 75.颜色分类 By Python
  13. AE插入音乐
  14. Micro开发文档
  15. mac上制作ubuntu引导盘
  16. 解决Yii2中刷新网页时验证码不刷新的问题
  17. SNF快速开发平台--规则引擎整体介绍及使用说明书
  18. php 启动服务器监听
  19. mysql备份与还原-mysqldump备份、mysql与source还原
  20. ECC校验

热门文章

  1. Codeforces 121A Lucky Sum
  2. 源码分析-react1-根节点渲染
  3. Android Studio Module 的添加与删除
  4. unary operator expected
  5. Python基础--高速改造:字符串
  6. 从Linux 2.6.8内核的一个TSO/NAT bug引出的网络问题排查观点(附一个skb的优化点)
  7. UML中类图的四种关系及其代码实现
  8. Linuxserver沦陷为肉鸡的全过程实录
  9. ubuntu拨号上网以及路由设置
  10. 微软将支持.net开源并跨平台,新特性会体现于VS2015