传送门
http://poj.org/problem?id=2406
题目大意
给定一个串A,保证A=n个B连起来,询问最大n
题解
其实求出最大n就是求最小B
KMP处理出A的next数组
我们回忆next的定义,next[i]表示A[1..next[i]]=A[i-next[i]+1..i]且next[i]最大,即B最小
那么肯定有最小循环节B为A[i-next[i]+1..i],如果不是,那最小循环节就是A本身
我忘了最后一行有’.’,WA了好几组QAQAQAQ
const
maxn=1000005;
var
next:array[0..maxn]of longint;
i,j,k:longint;
n,ans:longint;
cha:char;
a:ansistring;
begin
while not eof do
begin
n:=0;
readln(a); n:=length(a); if a='.' then break;
next[1]:=0; j:=0;
for i:=2 to n do
begin
while (j>0)and(a[j+1]<>a[i]) do j:=next[j];
if a[j+1]=a[i] then inc(j);
next[i]:=j;
end;
if n mod (n-next[n])=0 then ans:=n div (n-next[n]) else ans:=1;
writeln(ans);
end;
end.