Description

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

Input

第一行,一个整数n,表示 DNA序列的长度。
第二行,一个字符串,表示 DNA 序列的某一条链的碱基序列。

Output

输出只有一个数,为题目所求的最长特征 DNA 序列的长度。

Sample Input

7
GAATTCA

Sample Output

6

HINT

n≤ 50000

题解:

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

代码:

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

最新文章

  1. VB6史无前例的子类化之透明按钮
  2. 【非原创】IOS 验证文字是否是中文
  3. angular的跨域(angular百度下拉提示模拟)和angular选项卡
  4. HDU 2222 关键词查找
  5. javascript String 和StringBuffer 的应用
  6. JavaScript获取Select下拉框Option的Value和Text值的方法
  7. c/c++:内存泄露和野指针的概念
  8. asp.net core+ef core
  9. leetCode 34.Search for a Range (搜索范围) 解题思路和方法
  10. [转]Metasploit的meterpreter黑客脚本列表
  11. Http简单思维导图
  12. HBase中创建索引
  13. Core Animation简介
  14. HDU 1228(字符串处理)
  15. 【转】子类会调用父类的@PostConstruct方法
  16. 【云服务器部署】---Linux下安装MySQL
  17. BZOJ1078 [SCOI2008]斜堆 堆
  18. 2017-2018-1 20155208 课堂测试(ch06)(补做)
  19. 【转】jquery cookie操作
  20. oracle修改内存使用和性能调节,SGA

热门文章

  1. blocking and unblocking mechanism for linux drivern code
  2. 在C#里面给PPT添加注释
  3. Mysql加锁过程详解
  4. 利用Python进行数据分析(3) 使用IPython提高开发效率
  5. error RC1015: cannot open include file 'afxres.h' 解决办法
  6. C语言计算2个数的最小公倍数
  7. java动态代理的2种实现方式
  8. [(ngModel)]的实现原理
  9. filter 过滤器(监听)
  10. GJM : Unity3D 高通Vuforia SDK AR 开发