• 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;
    }
    

      

    人生如修仙,岂是一日间。何时登临顶,上善若水前。
  • 相关阅读:
    【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List
    【Leetcode】91. Decode Ways
    记一次面经
    涨知识
    B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)
    涨知识
    HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】
    POJ 1632 Vase collection【状态压缩+搜索】
    POJ 1011 Sticks 【DFS 剪枝】
    POJ 1088 滑雪 【记忆化搜索经典】
  • 原文地址:https://www.cnblogs.com/f-society/p/6701809.html
Copyright © 2020-2023  润新知