码迷,mamicode.com
首页 > 其他好文 > 详细

(简单) POJ 2406 Power Strings,扩展KMP。

时间:2015-07-18 12:30:39      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:

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).

 

  水题,扩展KMP。

 

代码如下:

技术分享
// ━━━━━━神兽出没━━━━━━
//      ┏┓       ┏┓
//     ┏┛┻━━━━━━━┛┻┓
//     ┃           ┃
//     ┃     ━     ┃
//     ████━████   ┃
//     ┃           ┃
//     ┃    ┻      ┃
//     ┃           ┃
//     ┗━┓       ┏━┛
//       ┃       ┃
//       ┃       ┃
//       ┃       ┗━━━┓
//       ┃           ┣┓
//       ┃           ┏┛
//       ┗┓┓┏━━━━━┳┓┏┛
//        ┃┫┫     ┃┫┫
//        ┗┻┛     ┗┻┛
//
// ━━━━━━感觉萌萌哒━━━━━━

// Author        : WhyWhy
// Created Time  : 2015年07月18日 星期六 10时54分33秒
// File Name     : 2406.cpp

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

const int MaxN=1000006;

void EKMP_pre(int m,char s[],int next1[])
{
    int p=0,a=1,L;

    next1[0]=m;
    
    while(p+1<m && s[p]==s[p+1])
        ++p;

    next1[1]=p;

    for(int k=2;k<m;++k)
    {
        L=next1[k-a];
        p=next1[a]+a-(next1[a]!=0);

        if(k+L-1<p)
            next1[k]=L;
        else
        {
            ++p;

            while(p<m && s[p]==s[p-k])
                ++p;

            next1[k]=p-k;
            a=k;
        }
    }

    next1[m]=0;
}

int N;
char s[MaxN];
int next1[MaxN];

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

    while(~scanf("%s",s))
    {
        if(s[0]==. && s[1]==0)
            break;

        N=strlen(s);

        EKMP_pre(N,s,next1);

        int i;

        for(i=1;i<N;++i)
            if(next1[i]+i==N && next1[i]%i==0)
                break;

        printf("%d\n",N/i);
    }
    
    return 0;
}
View Code

 

(简单) POJ 2406 Power Strings,扩展KMP。

标签:

原文地址:http://www.cnblogs.com/whywhy/p/4656411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!