poj 2406 Power Strings(KMP)

Power Stringspku 2406

给定两个字符串 a b,我们定义 a*b 为两个字符串的联接。例如,a = "abc" b = "def",则a*b = "abcdef"。把这个定义的运算看做多项式,则一个字符串的非负整数次幂定义如下: a^0 = "" (一个空字符串) a^(n+1) = a*(a^n)

输入:

每个测试样例为一行,即一个字符串s,其长度至少为1且不超过1000000。以句号“.”为最后一组测试样例。

输出:

对于每个给出的字符串s,你应该输出最大的n使得 s = a^n 等于某个字符串 a

输入样例:

abcd

aaaa

ababab

.
   
输出样例:

1

4

    3

分析

题目意思是对于给定的字符串s,找到其最短子串a,满足重复子串a可以得到字符串s。那么这个最短子串是s[next[len]]s[next[len]+1]...s[len-1]。当len%(len-next[len])==0时,说明字符串s有满足条件的不是它本身的子串,len/(len-next[len])即为所求最大的n。当len%(len-next[len])!=0时,字符串s除了它本身没有满足条件的子串,故n=1

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int next[1000005];
int len;

int get_next(char *p)
{
    next[0] = -1;
    int i = 0, j = -1;
    while(i <= len)
    {
        while(j == -1 || (i < len && p[i] == p[j]) )
        {
            i++;
            j++;
            next[i] = j;
        }
        j = next[j];
    }
    return 0;
}

int main()
{
    char a[1000005];
    while(scanf("%s", a) != EOF && strcmp(a,".") != 0)
    {
        len = strlen(a);
        get_next(a);
        if(len % (len - next[len]) == 0)
            printf("%d\n", len / (len - next[len]));
        else
            printf("1\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值