题目大意:给你一个字符串$s$和字符串$w$,字符集为${A,T,C,G}$,你要在字符串$s$中选出一个与$w$长度相同的子串,使得这两个串的差异度最小。

两个字符$c1$,$c2$的差异度为给定的$c[c1][c2]$。

字符串长度$≤2*10^5$。

$FFT$套路题。

我们将串$w$翻转。

设$p[i]$为$s$中子串$s[i-|w|+1.......i]$与$w$的差异度。

显然$p[i]=\sum_{j=0}^{i} c[s[j]][w[i-j]]$。(此处的$w$是翻转后的)

显然的卷积形式。

五次$FFT$即可。

 #include<bits/stdc++.h>
#define M (1<<19)
#define PI acos(-1)
#define INF 19890604
using namespace std; struct cp{
double i,r; cp(){i=r=;}
cp(double rr,double ii){i=ii;r=rr;}
friend cp operator +(cp a,cp b){return cp(a.r+b.r,a.i+b.i);}
friend cp operator -(cp a,cp b){return cp(a.r-b.r,a.i-b.i);}
friend cp operator *(cp a,cp b){return cp(a.r*b.r-a.i*b.i,a.r*b.i+a.i*b.r);}
friend cp operator /(cp a,double b){return cp(a.r/b,a.i/b);}
int num(){return (int)(i+0.499)/;}
}a[M],b[M],c[M],d[M],ans[M]; void change(cp a[],int len){
for(int i=,j=;i<len-;i++){
if(i<j) swap(a[i],a[j]);
int k=len>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
}
void FFT(cp a[],int len,int on){
change(a,len);
for(int h=;h<=len;h<<=){
cp wn=cp(cos(*on*PI/h),sin(*on*PI/h));
for(int j=;j<len;j+=h){
cp w=cp(,);
for(int k=j;k<(j+(h>>));k++){
cp u=a[k],t=w*a[k+(h>>)];
a[k]=u+t; a[k+(h>>)]=u-t;
w=w*wn;
}
}
}
if(on==-) for(int i=;i<len;i++) a[i]=a[i]/len;
} int D[][]={};
int get(char c){
if(c=='A') return ;
if(c=='T') return ;
if(c=='C') return ;
if(c=='G') return ;
} char s[M]={},w[M]={};
int n,m;
int main(){
scanf("%s%s",s,w); n=strlen(s); m=strlen(w);
for(int i=;i<;i++) scanf("%d",D[]+i);
for(int i=;i<n;i++) s[i]=get(s[i]);
for(int i=;i<m;i++) w[i]=get(w[i]);
reverse(w,w+m);
for(int i=;i<n;i++){
if(s[i]==) a[i].i=;
if(s[i]==) b[i].i=;
if(s[i]==) c[i].i=;
if(s[i]==) d[i].i=;
}
for(int i=;i<m;i++){
a[i].r=D[][w[i]];
b[i].r=D[][w[i]];
c[i].r=D[][w[i]];
d[i].r=D[][w[i]];
}
int len=; while(len<n+m) len<<=;
FFT(a,len,); FFT(b,len,); FFT(c,len,); FFT(d,len,);
for(int i=;i<len;i++){
ans[i]=a[i]*a[i]+b[i]*b[i]+c[i]*c[i]+d[i]*d[i];
}
FFT(ans,len,-);
int minn=INF;
for(int i=m-;i<n;i++)
minn=min(minn,ans[i].num());
cout<<minn<<endl;
}

【xsy1154】 DNA配对 FFT的更多相关文章

  1. [TJOI2017]DNA (FFT)

    [Luogu3763] FFT做字符串匹配即可,详见代码 // luogu-judger-enable-o2 #include<cstdio> #include<cstring> ...

  2. MIT molecular Biology 笔记11 位点特异性重组 和 DNA转座

    位点特异性重组 和 DNA转座 视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th ed ...

  3. Hairpin|Bulge|Loop|假结|共变化(进化)|单序列预测|snRNA|snoRNA|siRNA|microRNA|piRNA|LncRNA|antisense RNAs|cis-NATs|trans-NATs|假基因|环形RNA

    生物信息学 GU也可以配对,即“wobble” pairing GU. Hairpin发夹结构,最少不能少于3个碱基.没有配对 Bulge 单侧配对 Loop双侧配对 假结,游离的leading ed ...

  4. AC日记——配对碱基链 openjudge 1.7 07

    07:配对碱基链 总时间限制:  1000ms 内存限制:  65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成.而构成DNA的碱基共有4种,分别为腺瞟呤(A).鸟嘌 ...

  5. Codeforces 528D Fuzzy Search(FFT)

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

  6. OpenJudge计算概论-配对碱基链

    /*===================================== 配对碱基链 总时间限制: 1000ms 内存限制: 65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺 ...

  7. POJ C程序设计进阶 编程题#2: 配对碱基链

    编程题#2: 配对碱基链 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 脱 ...

  8. hdu 4609 3-idiots <FFT>

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...

  9. wikioi 3132 高精度乘法(FFT)

    第一次学FFT,先膜拜一下法法塔大神ORZ 关于FFT的话,有一篇博文特别赞http://z55250825.blog.163.com/blog/static/15023080920143127465 ...

随机推荐

  1. 2018.10.23 hdu4745Two Rabbits(区间dp)

    传送门 区间dp经典题目. 首先断环为链. 然后题目相当于就是在找最大的回文子序列. 注意两个位置重合的时候相当于范围是n,不重合时范围是n-1. 代码: #include<bits/stdc+ ...

  2. 2018.08.09洛谷P3959 宝藏(随机化贪心)

    传送门 回想起了自己赛场上乱搜的20分. 好吧现在也就是写了一个随机化贪心就水过去了,不得不说随机化贪心大法好. 代码: #include<bits/stdc++.h> using nam ...

  3. arduino IO口

    AVR单片机的每组I/O口都配备有三个8位寄存器,分别是:方向控制寄存器DDRx.数据寄存器PORTx.输入引脚寄存器PINx(x=A/B/C/D).I/O口的工作方式和表现特征由这三个I/O寄存器控 ...

  4. 使用ntpdate校正linux系统的时间

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...

  5. Deployment is out of date due to changes in the underlying project contents. Deployment is out of date due to changes in the underlying project contents. You'll need to manually 'Redeploy' the projec

    原因1:导入的jar包路径不对,造成第一个错误, 原因2:设置右键工程->属性->myeclipse->web->deployment选use workbenk defaul ...

  6. HDU 1718 Rank (排序)

    题意:给你n个学号和成绩,并且给定一个学号,让找这个学号是多少名. 析:用个结构体,按成绩排序,然后找那个学号,这个题有一个小坑,那就是并列的情况, 可能并列多少名,这个要考虑一下,其他的easy! ...

  7. python 取整itertools

    #coding:utf-8 import sys import itertools def MaxString(n,nums): list1 = nums list2 = [] for i in ra ...

  8. Apache Struts 2 Documentation Core Developers Guide

    http://struts.apache.org/docs/core-developers-guide.html

  9. 201709019工作日记--sleep、wait、notify的使用详解

    1. sleep()和wait()的区分 (1)这两个方法来自不同的类分别是,sleep来自Thread类,wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在 ...

  10. AQS详解(AbstractQueuedSynchronizer)

    Intrinsic VS explicity 1. 不一定保证公平              1. 提供公平和非公平的选择 2. 无                          2. 提供超时的 ...