题目链接:传送门
kmp裸题
因为前缀是从长到短覆盖的,所以从长到短累计加和
贴代码
var s:ansistring;
n,i,j:longint;
a:array[0..100005]of char;
f,p:array[0..100005]of longint;
ans:int64;
begin
// assign(input,'1277.in');reset(input);
// assign(output,'1277.out');rewrite(output);
readln(s);
n:=length(s);
for i:=1 to n do a[i]:=s[i];
fillchar(p,sizeof(p),0);
j:=0;
for i:=2 to n do
begin
while (j>0)and(a[j+1]<>a[i]) do j:=p[j];
if a[j+1]=a[i] then inc(j);
p[i]:=j;
end;
ans:=0;
fillchar(f,sizeof(f),0);
for i:=n downto 1 do
begin
inc(f[i]);
inc(f[p[i]],f[i]);
end;
for i:=1 to n do
if int64(i)*int64(f[i])>ans then ans:=int64(i)*int64(f[i]);
writeln(ans);
// close(input);close(output);
end.
【写的有漏洞的,欢迎路过大神吐槽】
2017/09/06 22:58:56
Ending.