码迷,mamicode.com
首页 > 编程语言 > 详细

hdu3068最长回文(Manacher算法)

时间:2015-01-06 23:04:31      阅读:334      评论:0      收藏:0      [点我收藏+]

标签:

简单来说这是个很水的东西。有点dp的思想吧。推荐两个博客,很详细。

http://blog.csdn.net/xingyeyongheng/article/details/9310555

http://blog.csdn.net/ggggiqnypgjg/article/details/6645824

 

然后以为随便学点然后去复习,结果……呵呵。什么鬼数据,两行之间用空行隔开……没看到一直wa半节课……

 

hdu3068最长回文

技术分享
var
  s1,s2:ansistring;
  s:array[0..1000000]of char;
  p:array[0..1000000]of longint;
  max,ans,mid,i,len:longint;
  ch:char;
  flag:boolean;

function min(x,y:longint):longint;
begin
  if x<y then min:=x
  else min:=y;
end;

begin
  while not eof do begin
    readln(s1);
    readln(s2);
    len:=length(s1);
    fillchar(p,sizeof(p),0);
    s[0]:=$;
    s[1]:=#;
    for i:=1 to len do begin
      s[i*2]:=s1[i];
      s[i*2+1]:=#;
    end;
    len:=len*2+2;
    s[len]:=#;
    mid:=0;
    max:=0;
    ans:=1;
    for i:=1 to len do begin
      if max>i then
        p[i]:=min(p[mid*2-i],max-i)
      else p[i]:=1;
      while s[i+p[i]]=s[i-p[i]] do inc(p[i]);
      if p[i]+i>max then begin
        max:=p[i]+i;
        mid:=i;
      end;
      if ans<p[i] then ans:=p[i];
    end;
    writeln(ans-1);
  end;
end.
View Code

 

简单来说就是判断是否被前面的覆盖到,如果有,根据对称性可以可得一个长度(min=(p[mid<<1-i],max-i)),如果没有就长度为1,然后再根据这个长度扩展,顺便更新下最大值。

这渣状态……!!

hdu3068最长回文(Manacher算法)

标签:

原文地址:http://www.cnblogs.com/Macaulish/p/4207010.html

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