51nod1565 FFT
思路:
显然拆位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);
}
51nod1565 FFT的更多相关文章
- 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)
对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...
- 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2978 Solved: 1523[Submit][Status][Di ...
- 为什么FFT时域补0后,经FFT变换就是频域进行内插?
应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...
- FFT NNT
算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...
- CC countari & 分块+FFT
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
- ECF R9(632E) & FFT
Description: 上一篇blog. Solution: 同样我们可以用fft来做...就像上次写的那道3-idoit一样,对a做k次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...
- fft练习
数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...
- FFT时域与频域的关系,以及采样速率与采样点的影响
首先对于FFT来说,输入的信号是一个按一定采样频率获得的信号序列,而输出是每个采样点对应的频率的幅度(能量). 下面详细分析: 在FFT的输出数据中,第一个值是直流分量的振幅(这样对应周期有无穷的可能 ...
- 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT
前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...
随机推荐
- ssh中将常用的命令做别名
1.vim ~/.bashrc 将光标落到user下面 2. 输入 alias x=‘ssh的命令’ 3.按ESC键,退出输入状态: 4.按:,然后输入wq,保存退出: 5. source ~/.ba ...
- convert images to a video (Ubuntu)
use =avconv= package e.g. to convert images (v_1.png, v_2.png ...) to 'velocity.mp4' >>> a ...
- 字符串hash-BKDRHash
unsigned int BKDRHash(char *str) { unsigned ; // 31 131 1313 13131 131313 etc.. unsigned ; while (*s ...
- Tensorflow Eager execution and interface
Lecture note 4: Eager execution and interface Eager execution Eager execution is (1) a NumPy-like li ...
- noip模拟赛 立方数2
题目描述LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数.LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立 ...
- python函数基础:嵌套函数、作用域、匿名函数、高阶函数、递归函数
嵌套函数: 1. 函数内部可以再定义函数 2. 函数只有被调用之后才会执行 看如下代码: age = 18 def func1(): age = 22 print(age) def func2(): ...
- vue组件知识总结
vue组件化开发 将一个页面分割成若干个组件,一个页面js+css+html,将自己类容分割出来,方便开发,更好了维护我们的代码,每个组件封装自己的js+html+css,样式命名冲突 组件分类 页面 ...
- Weakness and Poorness CodeForces - 578C 三分搜索 (精度!)
You are given a sequence of n integers a1, a2, ..., an. Determine a real number x such that the weak ...
- 26、Java并发性和多线程-线程池
以下内容转自http://ifeve.com/thread-pools/: 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个 ...
- gn3 --iou
http://www.wyzc.com/Course/Course/learnAction/id/14049/center/0#lesson/400847 http://www.mamicode.co ...