题意很简单、、给定一个串求最长回文子串、、
然后就是一个裸的好似叫manachure算法的东西、、
用O(n)的复杂度求最长回文子串、、
Code:
var
s:ansistring;
a:array [0..2000100] of char;
p:array [0..2000100] of longint;
cur,en,ans,len,vv,n,i,id:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
begin
readln(s);
while s<>'END' do
begin
len:=length(s);n:=0;inc(vv);
for i:=1 to len do
begin
inc(n);a[n]:=s[i];
inc(n);a[n]:='#';
end;
fillchar(p,sizeof(p),0);
a[n]:='$';
en:=0;ans:=0;
for i:=1 to n-1 do
begin
if en>i then
p[i]:=min(p[id*2-i],en-i)
else p[i]:=1;
while (i>p[i]) and (a[i-p[i]]=a[i+p[i]]) do inc(p[i]);
dec(p[i]);
if i+p[i]>en then
begin
en:=i+p[i];
id:=i;
end;
if i and 1=1
then cur:=p[i] div 2*2+1
else cur:=(p[i]+1) div 2*2;
if cur>ans then ans:=cur;
end;
writeln('Case ',vv,': ',ans);
readln(s);
end;
end.