uva1328 Period

78 篇文章 0 订阅

For each pre x of a given string S with N characters (each character
has an ASCII code between 97 and 126, inclusive), we want to know
whether the pre x is a periodic string. That is, for each i (2 i N
) we want to know the largest K > 1 (if there is one) such that the
pre x of S with length i can be written as A K , that is A
concatenated K times, for some string A . Of course, we also want to
know the period K . Input The input le consists of several test
cases. Each test case consists of two lines. The rst one contains N
(2 N 1000000) the size of the string S . The second line contains
the string S . The input le ends with a line, having the number zero
on it. Output For each test case, output ` Test case # ’ and the
consecutive test case number on a single line; then, for each pre x
with length i that has a period K > 1, output the pre x size i and the
period K separated by a single space; the pre x sizes must be in
increasing order. Print a blank line after each test case.

利用kmp算法,对于位置i,最短的循环节是i-next[i]。判断i是否能整除它即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1000010];
int ne[1000010];
int main()
{
    int i,j,l,K=0;
    while (scanf("%d",&l)&&l)
    {
        scanf("%s",s+1);
        printf("Test case #%d\n",++K);
        for (i=2,j=0;i<=l;i++)
        {
            while (j&&s[j+1]!=s[i]) j=ne[j];
            if (s[j+1]==s[i]) j++;
            ne[i]=j;
            if (ne[i]&&i%(i-ne[i])==0) printf("%d %d\n",i,i/(i-ne[i]));
        }
        printf("\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值