首页 > 其他 > 详细

CODE[VS]1372DNA

时间:2017-01-07 00:00:57      阅读:330      评论:0      收藏:0      [点我收藏+]

为了进一步分析外星生物,专家们决定对 DNA 进行切割。
限制性核酸内切酶是基因工程中的重要的工具酶。它会识别一段碱基序列(说白了
就是只包含 ATGC 的序列)并且切割开。EcoRI 是某种限制酶的名称,它识别有某
种特性的 DNA序列,即 DNA序列双链反向排列相同的。(双链对应位碱基对要
满足碱基互补配对原则)
比如识别序列为 G A A T T C
互补链序列为 C T T A A G
第一条链从左读和第二条链从右读的是一样的。
专家们想知道某一段 DNA的序列中,具有这种特性的 DNA子序列(连续)最长
是多少,可限于智商,他们无法做出判断……于是,他们想到了你。

 

题解:

用Manacher算法求最长回文串,只不过回文的条件变为对称互补,而不是对称相等。

 

代码:

uses math;
var
  i,j,k,l,n,m,ans:longint;
  a,b:array[0..100001]of longint;
  ch:char;
begin
  readln(n);
  for i:=1 to n do
  begin
    inc(m); a[m]:=0; inc(m); read(ch);
    case ch of
      G:a[m]:=-2;
      C:a[m]:=2;
      A:a[m]:=1;
      T:a[m]:=-1;
    end;
  end;
  inc(m); a[m]:=0; a[m+1]:=maxlongint div 2;
  a[0]:=maxlongint div 2;
  k:=1; l:=1; b[1]:=1; ans:=1;
  for i:=2 to m do
  if i mod 2=1 then
  begin
    if l>=i then
    b[i]:=min(b[2*k-i],l-i+1)else b[i]:=1;
    while true do
    begin
      if a[i+b[i]]+a[i-b[i]]=0 then inc(b[i])
      else break;
    end;
    if b[i]>ans then ans:=b[i];
    if b[i]+i-1>l then begin l:=b[i]+i-1; k:=i; end;
  end;
  writeln((ans div 2)*2);
end.

CODE[VS]1372DNA

原文:http://www.cnblogs.com/GhostReach/p/6257519.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!