poj 2406 Power Strings KMP算法

题目:对于给定的字符串s,找到其最短子串a,满足重复子串a可以得到字符串s,求重复多少次a可以得到字符串s。

分析:首先next[j]=max{k|1<=k<=j且's1s2...sk'='sj-k+1...sj'},若无满足条件的k则为0.那么根据next数组的定义容易的出最短子串a即为s[next[len]+1]s[next[len]+2]…s[len](len为s的长度)。当len mod (len-next[len])=0是说明字符串s有满足条件的不是它本身的子串,len div (len-next[len])即为所求的最大的n,否则s则除了它本身没有满足条件的子串,故n=1.

下面附代码:

var
  s:ansistring;
  len:longint;
  next:array[0..1000000] of longint;

procedure get;
var
  i,j:longint;
begin
  next[0]:=-1;
  next[1]:=0;
  i:=2;
  j:=0;
  while i<=len do
    if (j=-1)or(s[j+1]=s[i])
      then begin
             inc(j);
             next[i]:=j;
             inc(i);
           end
      else j:=next[j];
end;

begin
  readln(s);
  while s[1]<>'.' do
  begin
    len:=length(s);
    get;
    if len mod (len-next[len])=0
      then writeln(len div (len-next[len])) 
      else writeln(1);
    readln(s);
  end;
end.


你可能感兴趣的:(poj 2406 Power Strings KMP算法)