【xsy1154】 DNA配对 FFT
题目大意:给你一个字符串$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的更多相关文章
- [TJOI2017]DNA (FFT)
[Luogu3763] FFT做字符串匹配即可,详见代码 // luogu-judger-enable-o2 #include<cstdio> #include<cstring> ...
- MIT molecular Biology 笔记11 位点特异性重组 和 DNA转座
位点特异性重组 和 DNA转座 视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th ed ...
- 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 ...
- AC日记——配对碱基链 openjudge 1.7 07
07:配对碱基链 总时间限制: 1000ms 内存限制: 65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成.而构成DNA的碱基共有4种,分别为腺瞟呤(A).鸟嘌 ...
- Codeforces 528D Fuzzy Search(FFT)
题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...
- OpenJudge计算概论-配对碱基链
/*===================================== 配对碱基链 总时间限制: 1000ms 内存限制: 65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺 ...
- POJ C程序设计进阶 编程题#2: 配对碱基链
编程题#2: 配对碱基链 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 脱 ...
- hdu 4609 3-idiots <FFT>
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...
- wikioi 3132 高精度乘法(FFT)
第一次学FFT,先膜拜一下法法塔大神ORZ 关于FFT的话,有一篇博文特别赞http://z55250825.blog.163.com/blog/static/15023080920143127465 ...
随机推荐
- Django入门与实践-第22章:基于类的视图
http://127.0.0.1:8000/boards/1/topics/2/posts/2/edit/ http://127.0.0.1:8000/ #boards/views.py from d ...
- 在centos7.1上安装systemd
1.检查本地systemd的版本 [admin@localhost ~]$ systemctl --version systemd 208 +PAM +LIBWRAP +AUDI ...
- python读写操作
import sys 1 def test(): a=int(input()) x=[int(i) for i in input().split(' ')] y=[int(j) for j in sy ...
- Word图片上传控件(WordPaster)更新-2.0.15版本
更新说明: 1. 增加对webp图片的支持,支持微信公众号图片的下载. 效果参考:http://www.ncmem.com/doc/view.aspx?id=9761f8ce4fe04d0ab0f ...
- scanf和fscanf读取文件
这篇是针对推箱子游戏而写的,某个时候在学C语言,最近转到windows设计,不知道是否有同样的感受,后面的东西学了,前面的就有点生疏了.其实,我的理解是,注意力转移了,当集中于当前问题的时候就会忽略以 ...
- PAT 甲 1005. Spell It Right (20) 2016-09-09 22:53 42人阅读 评论(0) 收藏
1005. Spell It Right (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given ...
- C++中的inline声明
C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(i ...
- 动态的把固定格式的json数据以菜单形式插入
var root=$("#side-menu"); $(menuData).each(function(i,n){ var top1Li=$("<li>< ...
- 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)
蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数.其时间复杂度为 O(N),包含 ...
- 用C#开发的双色球走势图(原创)值得园友拥有
首先声明,个人纯粹无聊之作,不作商业用途. 我相信每个人都拥有一个梦想那就是有朝一日能中500W,这个也一直是我的梦想,并默默每一期双色球或多或少要贡献自己一点点力量,本人并不属于那种铁杆的彩票迷,每 ...