Power Strings_poj2406_kmp

来源:互联网 发布:server2008 网络驱动 编辑:程序博客网 时间:2024/06/06 01:10

Description

Given two strings a and b we define a*b to be their concatenation. For example, if a = “abc” and b = “def” then a*b = “abcdef”. If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = “” (the empty string) and a^(n+1) = a*(a^n).

Input

Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a^n for some string a.

Hint

This problem has huge input, use scanf instead of cin to avoid time limit exceed.

题解

根据nex数组的定义可以得知字符串1~j与i-j~i完全匹配,则找到离末尾最近的匹配串的长度,用总长除一下就好了

代码

var  s:ansistring;  p:array[0..1000000]of longint;  i,ans:int64;procedure init(s:ansistring);var  i,j:longint;begin  p[1]:=0;  j:=0;  for i:=2 to length(s) do  begin    while (s[j+1]<>s[i])and(j>0) do j:=p[j];    if (s[j+1]=s[i]) then      inc(j);    p[i]:=j;  end;end;begin  while not eof do  begin    readln(s);    if s='.' then exit;    init(s);    i:=length(s);    ans:=i div(i-p[i]);    if i mod (i-p[i])<>0 then      ans:=1;    writeln(ans);  end;end.
0 0
原创粉丝点击