标签:
简单来说这是个很水的东西。有点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.
简单来说就是判断是否被前面的覆盖到,如果有,根据对称性可以可得一个长度(min=(p[mid<<1-i],max-i)),如果没有就长度为1,然后再根据这个长度扩展,顺便更新下最大值。
这渣状态……!!
标签:
原文地址:http://www.cnblogs.com/Macaulish/p/4207010.html