题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
KMP自己匹配自己
pi
为最大
k
满足
若成立,循环数为
贴代码
var a:array[0..1000005]of char;
p:array[0..1000005]of longint;
tot,n:longint;
procedure work;
var i,j:longint;
begin
inc(tot);
for i:=1 to n do read(a[i]);
readln;
j:=i;
fillchar(p,sizeof(p),0);
for i:=2 to n do
begin
while (j>0)and(a[i]<>a[j+1]) do j:=p[j];
if a[i]=a[j+1] then inc(j);
p[i]:=j;
end;
writeln('Test case #',tot);
for i:=2 to n do
if (i mod (i-p[i])=0)and(i div (i-p[i])>1) then writeln(i,' ',i div (i-p[i]));
writeln;
end;
begin
// assign(input,'1.in');reset(input);
// assign(output,'1.out');rewrite(output);
readln(n);tot:=0;
while n<>0 do
begin
work;
readln(n);
end;
close(input);close(output);
end.
【写的有漏洞的,欢迎路过大神吐槽】
2017/09/05 21:38:13
Ending.