poj 2406 Power Strings(kmp next数组的应用)

本文介绍了一种利用KMP算法中的next数组来确定一个字符串是否由若干个相同子串重复组成的算法。通过实例详细解释了如何判断一个字符串是否可以被分解为多个重复的子串,并提供了完整的代码实现。

分析转自:http://www.cnblogs.com/zhanzhao/p/4761477.html

大意:给出一个字符串 问它最多由多少相同的字串组成 

如  abababab由4个ab组成

 

分析:

kmp中的next数组求最小循环节的应用

例如 

ababab  next[6] = 4; 即

 

ababab

   ababab

1~4位  与2~6位是相同的

 

 

那么前两位

就等于3、4位

3、4位就等于5、6位

……

所以 如果 能整除  也就循环到最后了

 

如果不能整除  

就最后余下的几位不在循环内

 

例如

1212121

  1212121

最后剩余1不能等于循环节


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e6+5;
char str[maxn];
int next[maxn];

void makeNext(void)
{
    int len = strlen(str);
    next[0] = next[1] = 0;
    for(int i = 1; i < len; i++)
    {
        int j = next[i];
        while(j && str[i] != str[j]) j = next[j];
        next[i+1] = str[i]==str[j] ? j+1 : 0;
    }
}

int main(void)
{
    while(~scanf(" %s", str))
    {
        if(str[0] == '.') break;
        makeNext();
        int len = strlen(str);
        if(len%(len-next[len]) == 0) printf("%d\n", len/(len-next[len]));
        else puts("1");
    }
    return 0;
}


Power Strings
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 44865 Accepted: 18741

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.

Sample Input

abcd
aaaa
ababab
.

Sample Output

1
4
3

Hint

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

Source


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值