题目大意:给你一个字符串$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. java网络爬虫实现信息的抓取

    转载请注明出处:http://blog.csdn.NET/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点 ...

  2. 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)

    描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...

  3. 2018.06.29 NOIP模拟 Gcd(容斥原理)

    Gcd 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出n个正整数,放入数组 a 里. 问有多少组方案,使得我从 n 个数里取出一个子集,这个子集的 gcd 不为 1 ,然后我再从 ...

  4. gj6 深入python的set和dict

    6.1 collections中的abc from collections.abc import Mapping, MutableMapping #dict属于mapping类型 a = {} pri ...

  5. Windows 下安装mysql总结

    1.配置环境变量 将安装目录添加到系统路径 我的电脑->属性->高级->环境变量->path 2.修改my.ini 位于解压安装目录下 在其中修改或添加配置: [mysqld] ...

  6. Linux上查看造成IO高负载的进程

    方法1:使用iotop工具这是一个python脚本工具,使用方法如:iotop -o方法2:使用工具dmesg使用dmesg之前,需要先开启内核的IO监控:echo 1 >/proc/sys/v ...

  7. Sql Server R8 密码问题及5102错误

    登录的两种方式: 集成登录连接:con = new SqlConnection("server=.\\SQLEXPRESS;database=db_news;Trusted_Connecti ...

  8. 使用系统的CoreLocation定位

    ////  ViewController.m//  LBS////  Created by tonnyhuang on 15/8/28.//  Copyright (c) 2015年 tonnyhua ...

  9. What Is Your Grade?

    Problem Description “Point, point, life of student!”This is a ballad(歌谣)well known in colleges, and ...

  10. hdu 4994 前后有序Nim游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=4994 Nim游戏变成从前往后有序的,谁是winner? 如果当前堆数目为1,玩家没有选择,只能取走.遇到到不为1 ...