【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 ...
随机推荐
- Linux下Git安装及配置
转载自:https://blog.csdn.net/u013256816/article/details/54743470:加了一些自己的注释. yum安装 这里采用的是CentOS系统,如果采用yu ...
- AD采样的一个例子
用122.88k时钟采样153.6k的信号
- nginx 配置图片服务器 (window版本)
配置nginx二级域名 ①找到配置文件 例如:%nginx_home%/conf/nginx.conf ②配置 #user nobody; worker_processes 1; #error_log ...
- HDU1518 Square(DFS) 2016-07-24 15:08 49人阅读 评论(0) 收藏
Square Problem Description Given a set of sticks of various lengths, is it possible to join them end ...
- hdu 5032 不易发觉的树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=5032 给定一个1000x1000的点阵,m组询问,每次询问一个由(0,0).(x,0)点一以及从原点出发的方向向 ...
- 与数据库连接的页面增删改查 的easyui实现(主要是前端实现)
一.首先看一下最终实现的效果,上图 二.思路,主要是分两个文件实现,一个是页面显示文件:代码如下: <html> <head> <title>示例管理</ti ...
- 对Spring 容器管理事务支持的总结
1.问题 Connection conn = DataSourceUtils.getConnection(); //开启事务 conn.setAutoCommit(false); try { Obje ...
- [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?
场景:在平常我们使用word文档等等office办公软件时,我们常会使用搜索->替换的功能. mysql: 在mysql 中有时候,我们也需要这样子的实现: 实现 SQL 语句: update ...
- [翻译]CSS3 Media Queries
Media Queries Official Manual:http://www.w3.org/TR/css3-mediaqueries/ 原文链接:http://www.smashingmagazi ...
- visual studio code 中隐藏从 ts 文件生成的 js 文件和 map 文件
typescript 文件编译产生的 js 和 map 文件不需要手工编辑,打开[文件][首选项][工作区设置],放入以下代码: // 将设置放入此文件中以覆盖默认值和用户设置. { "fi ...