[POJ2406] Power Strings

传送门

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值