KMP poj 2406 Power Strings 字符串的幂

原创 2013年12月03日 13:25:12

题意:

    给定两个字符串a和b,定义式子:a*b表示两个字符串的连接,例如:a = "abc", b = "def" 则:a*b = "abcdef"。如果将连乘看成乘法,则按照普遍的方法一个非负整数的幂表示如下: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

输入:

    输入字符串S每组样例一行,S为可打印字符.S长度在1~1000000之间,最后一组数据后为“.”表示结束。

输出:

   每个S输出最大的n满足:S = a^n,其中a为任意字符串。


分析:

    题目大意:给出一个字符串,求出他的最小重复单元是什么,进而再求出重复次数,例如:“aaaa”最小重复单元是“a”重复次数是4;

解题思路:设字符串S = “abcabc”求其next数组:

S:       a  b  c  a  b  c

next[j]: -1 0  0  0  1  2  3

在这里为了计算要多算出一位,那么可能成为最小重复单元的长度可由下面的规则确定:

(1)若2*next[len] < len 则最小重复单元长度为len那么他重复次数为1

(2)若2*next[len] > len 则:

1>:如果len%(len-next[len]) == 0则最小重复单元长度为len - next[len],那么其重复次数为len/(len-next[len]).

2>:如果len%(len - next[len]) != 0 则最小重复单元长度为:len,那么其重复次数为1

好好揣摩以上两点!

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 1000010;

int next[MAXN];

void Get_next(char* str)
{
    int i = 0, j = -1;
    next[0] = -1;
    int len = strlen(str);
    while(i < len)
    {
        if(j == -1 || str[i] == str[j])
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
            j = next[j];
    }
}


int main()
{
    char str[MAXN];
    while(~scanf("%s", str))
    {
        if(str[0] == '.')
            break;
        Get_next(str);
        int len = strlen(str);
        if(2*next[len] < len)
            cout<<"1"<<endl;
        else
        {
            if(len % (len - next[len]) == 0)
                cout<<len/(len-next[len])<<endl;
            else
                cout<<"1"<<endl;
        }
    }
    return 0;
}


版权声明:本文为博主原创文章,转载需注明出处。

POJ - 2406 Power Strings解题报告(KMP,字符串划分成若干连续相同子串)

题目大意:好像就是说,好多组测试数据,每组测试数据就是给你一串字符串,然后让你找出一个最短的子串,这个子串满足条件:若干个该子串连接就能组成原字符串。 也就是让你想办法把所给字符串划分成尽量短的若干相...

LA3026 POJ1961 period 字符串周期(KMP) POJ2406 Power Strings

POJ 1961 http://poj.org/problem?id=1961  Period Description For each prefix of a given str...

[KMP][后缀数组] poj2406 Power Strings

DescriptionGiven two strings a and b we define a*b to be their concatenation. For example, if a = “a...

[POJ 2406] Power Strings (kmp循环节)

链接POJ 2406题意给出一个字符串,输出其最短循环节长度。题解首先说一下循环节,其实每个字符串都是有循环节的,最长的循环节就是它本身。 如果一个字符串s可以写成某个字符串d复制k次得到的,那么d...

poj2406--Power Strings+KMP求周期

先把结论摆出来:对于长为j的字符串str[1..j],next[j]=k,则令d=j-k;如果j%d==0,则这个字符串是一个 周期串,前d个字符是其最小的循环结,共包含j/d个循环节。 现在来解...
  • acm_lkl
  • acm_lkl
  • 2015年02月07日 15:49
  • 443

POJ -2406 Power Strings(循环节,kmp专题)

A - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Sub...

Power Strings (poj 2406 KMP)

Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total ...

poj - 2406 Power Strings 【KMP】

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 45224   Accepted:...

poj 2406 Power Strings kmp

Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total ...

POJ 2406 Power Strings(KMP)

题目链接:点我Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" ...
  • cccruel
  • cccruel
  • 2017年08月05日 09:52
  • 76
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:KMP poj 2406 Power Strings 字符串的幂
举报原因:
原因补充:

(最多只允许输入30个字)