zoukankan      html  css  js  c++  java
  • Power Strings(KMP)

    Power Strings
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 45008   Accepted: 18794

    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.

    Source

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<string.h>
    #define N 1000010
    using namespace std;
    int next[N];
    char str[N];
    void getnext(char str[],int next [])
    {
        next[0]=next[1]=0;
        int len=strlen(str);
        for(int i=1;i<len;i++)
        {
            // cout<<len<<endl;
            int k=next[i];
            while(k&&str[i]!=str[k]) 
            {
                k=next[k];
                //cout<<k<<endl;
            }    
            next[i+1]=(str[i]==str[k])?k+1:0;
            
        }
    }
    int main()
    {
        //freopen("C:\Users\acer\Desktop\in.txt","r",stdin);
        while(scanf("%s",&str)!=EOF)
        {
            //cout<<str<<endl;
            int m=strlen(str);
            if(m==1)
                break;
            getnext(str,next);
            // for(int i=0;i<m;i++)
                // cout<<next[i]<<" ";
            // cout<<endl;
            if(m%(m-next[m])==0)
                printf("%d
    ",m/(m-next[m]));
            else
                puts("1");
        }
        return 0;
    }
  • 相关阅读:
    Merge Two Sorted Lists
    4Sum
    Letter Combinations of a Phone Number
    3Sum Closest
    3Sum
    Longest Common Prefix
    Roman to Integer
    Integer to Roman
    Container With Most Water
    Regular Expression Matching
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/5978395.html
Copyright © 2011-2022 走看看