• poj2406 Power Strings (kmp 求最小循环字串)


                                         Power Strings
     
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 47748   Accepted: 19902

    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.
     
    题意:
    给你一个字符串,求该字符串最多由多少个循环字串构成。
     
    题解:
      定义一个整型变量 m;   //m表示字符串长度
      用kmp里的next数组 求出字符串的最长前缀长度,然后判断 m 是否能被 m-next[m] 整除,即 m%(m-next[m])是否等于0,如果能被整除,m-next[m]为最短循环字串,否则最短循环字串长度等于整个字符串长度。
     
    AC代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int next[1000002];
    char a[1000002];
    
    void getNext()
    {
        int i=-1,j=0;
        next[0]=-1;
        int cnt=0;
        while(a[j])
        {
            if(a[i]==a[j]||i==-1)
            {
                next[++j]=++i;
            }
            else
                i=next[i];
        }
    }
    int main()
    {
        while(scanf("%s",a)!=EOF)
        {
            if(a[0]=='.') break;
            int m=strlen(a);
            getNext();
            int cc=1;
            if(m%(m-next[m])==0)  //如果条件满足,m-next[m]为最短循环字串,然后求出该字符串由多少个最短循环字串构成
                cc=m/(m-next[m]);
            cout<<cc<<endl;
        }
        return 0;
    }
    

      

    人生如修仙,岂是一日间。何时登临顶,上善若水前。
  • 相关阅读:
    MKMapViewDelegate
    MKMapView
    正则表达式随手篇
    c#多线程
    sql模糊查询效率
    c#多线程,进度条,实时给前台发送数据
    如何使用CocoaPods
    TabBar自定义方式(一)
    Spring MVC 学习资料
    优化Myeclipse10 Building Workspace速度慢等问题
  • 原文地址:https://www.cnblogs.com/f-society/p/6701809.html
Copyright © 2020-2023  润新知