HDU1358 Period

3 篇文章 0 订阅

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
KMP自己匹配自己
pi 为最大 k 满足k<i a1k a 的后缀匹配
若成立,循环数为i/(ipi)
贴代码

 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值