• hdu3068最长回文(Manacher算法)


    简单来说这是个很水的东西。有点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,然后再根据这个长度扩展,顺便更新下最大值。

    这渣状态……!!

  • 相关阅读:
    IfcDirection
    IfcPcurve
    IfcOffsetCurve3D
    IfcOffsetCurve2D
    IfcLine
    IfcEllipse
    IfcCircle
    IfcConic
    IfcTrimmedCurve
    QDockWidget设置为tab切换形式
  • 原文地址:https://www.cnblogs.com/Macaulish/p/4207010.html
Copyright © 2020-2023  润新知