poj 2406 Power Strings-字符串(kmp)

原创 2016年08月30日 18:44:52

Power Strings

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

题意

给你一个字符串,找出他最多是重复了几次。比如aaaa就是以a重复了4次,abab就是以ab重复了2次

解题思路

首先找到周期,然后再判断重复了几次。

找周期的时候引用两个下标 i,j 。i-j表示周期的长度,j表示上一个周期内某个元素,i表示这个元素对应的下一个周期中的元素。

i初始为0,j初始为-1。

例如

字符串a为 ababa

数组b存的是每个字符的重复次数,初始为零,最终答案就是最后一个字符重复次数加1即可

0 1 2 3 4
a b a b a

当i=1指向b,j=0指向a时,二者不相等 ----->(说明周期找的不对,重新找) j重新指向头,i后移一个单位

此时i=2指向a,j=0指向a,二者相等 ------>b[i]=b[j]+1]=1   i,j分别后移一个单位,周期为2

此时i=3指向b,j=1指向b,二者相等 ------>b[i]=b[j]+1] =1  i,j分别后移一个单位,周期为2

此时i=4指向a,j=2指向a,二者相等------>b[i]=b[j]+1] =2   i,j分别后移一个单位,周期为2

此时i=5指向结束符,j=3指向b,二者不相等 并且字符长度为5不能整除周期2 ----->b[ 0~i ] =0,(循环次数清零)

代码

#include <cstring>
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#define INF 0x3f3f3f3f
const int maxn=50100;
using namespace std;
char s[1000000];
int  b[1000000];
int main()
{
    while(scanf("%s",s) && s[0]!='.')
    {
        memset(b,0,sizeof(b));
        int j=-1,i=0;
        int len=strlen(s);
        while(i<len)
        {
            i++;j++;

            if(s[i]==s[j])
            {
                b[i]=b[j]+1;
            }
            else//周期不对就重新找
            {
                if(i>=len)
                    if(len%(i-j)==0)
                        break;

                j=-1;
             for(int k=0;k<=i;++k)
                b[k]=0;
            }
        }
        printf("%d\n",b[len-1]+1);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

KMP poj 2406 Power Strings 字符串的幂

题意:     给定两个字符串a和b,定义式子:a*b表示两个字符串的连接,例如:a = "abc", b = "def" 则:a*b = "abcdef"。如果将连乘看成乘法,则按照普遍的方法一个...

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个循环节。 现在来解...

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

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

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 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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