zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

    人生如修仙,岂是一日间。何时登临顶,上善若水前。
  • 相关阅读:
    java.lang.NoClassDefFoundError: javax/el/ExpressionFactory
    多文本框的值得存放和赋值
    多个相同元素的展开和收起
    java中把对象、对象bean、list集合、对象数组、Map和Set以及字符串转换成Json
    上传控件获取的文件路径不对
    C#中的DataSet、string、DataTable 、对象转换成Json
    jquery 操作DOM的基本用法
    JS 实现文件夹目录选择
    vue 调取腾讯webService API遇到跨域使用 jsonp
    nodesass和sassloader版本冲突问题导致sassloader报错
  • 原文地址:https://www.cnblogs.com/f-society/p/6701809.html
Copyright © 2011-2022 走看看