码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))

时间:2019-06-23 15:34:20      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:字符   pen   define   排列   position   bit   hide   ==   sed   

基因匹配Match

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
 
 

题目描述

基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成

DNA序列的每一种碱基在该序列中正好出现5次!这样如果一个DNA序列有N种不同的碱基构成,那么它的长度一定是5N。 卡卡醒来后向可可叙述了这个奇怪的梦,而可

可这些日子正在研究生物信息学中的基因匹配问题,于是他决定为这个奇怪星球上的生物写一个简单的DNA匹配程序。 为了描述基因匹配的原理,我们需要先定义子序

列的概念:若从一个DNA序列(字符串)s中任意抽取一些碱基(字符),将它们仍按在s中的顺序排列成一个新串u,则称u是s的一个子序列。对于两个DNA序列s1和

s2,如果存在一个序列u同时成为s1和s2的子序列,则称u是s1和s2的公共子序列。 卡卡已知两个DNA序列s1和s2,求s1和s2的最大匹配就是指s1和s2最长公共子序列的

长度。 [任务] 编写一个程序: ? 从输入文件中读入两个等长的DNA序列; ? 计算它们的最大匹配; ? 向输出文件打印你得到的结果。

输入格式

输入文件中第一行有一个整数N,表示这个星球上某种生物使用了N种不同的碱基,以后将它们编号为1…N的整数。 以下还有两行,每行描述一个DNA序列:包含5N个

1…N的整数,且每一个整数在对应的序列中正好出现5次。

输出格式

输出文件中只有一个整数,即两个DNA序列的最大匹配数目。

样例

样例输入

2
1 1 2 2 1 1 2 1 2 2
1 2 2 2 1 1 2 2 1 1

样例输出

7

数据范围与提示

60%的测试数据中:1<=N <= 1 000

100%的测试数据中:1<=N <= 20 000

lcs(nlogn)直接模板搞

具体操作lcs转lis

因为lis可以nlogn

所以lcs可以nlogn

别的博客写的什么树状数组

要是真到考试我绝对想不到这种做法

我太菜了

技术图片
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define A 200001
 4 using namespace std;
 5 ll id=0,num=0,n,a[A],b[A],f[A],lis[A],o[A+A+A+A+A],len=0;
 6 vector <ll> fl[A];
 7 inline ll read()
 8 {
 9     ll f=1,x=0;
10     char ch=getchar();
11     while(ch<0||ch>9)
12     {
13         if(ch==-) f=-1;
14         ch=getchar();
15     }
16     while(ch>=0&&ch<=9)
17     {
18         x=(x<<1)+(x<<3)+(ch^48);
19         ch=getchar();
20     }
21     return f*x;
22 }
23 int main()
24 {
25     n=read();n*=5;
26         for(ll i=1;i<=n;i++)
27         {a[i]=read();b[n-i+1]=a[i];}
28     for(ll i=1;i<=n;i++)
29     {
30         b[i]=read();
31         fl[b[i]].push_back(i);
32     }
33     for(ll i=1;i<=n;i++)
34     {
35         ll nu=4;
36         while(nu>=0)
37         {    
38             o[++num]=fl[a[i]][nu];
39             nu--;
40         }
41     }
42     for(ll i=1;i<=num;i++)
43     {
44         if(len==0||lis[len]<o[i])
45             lis[++len]=o[i];
46         else 
47         {
48             ll p=lower_bound(lis,lis+len,o[i])-lis;
49             lis[p]=o[i];
50         }
51     }
52     cout<<len<<endl;
53 }
View Code

 

bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))

标签:字符   pen   define   排列   position   bit   hide   ==   sed   

原文地址:https://www.cnblogs.com/znsbc-13/p/11072789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!