• POJ2406Power Strings[KMP 失配函数]


    Power Strings
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 45005   Accepted: 18792

    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


    只需要求n的错位部分n-f[n]是不是循环节
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=1e6+5;
    int n,f[N];
    char p[N];
    int main(){
        int cas=0;
        while(true){
            scanf("%s",p);
            n=strlen(p);
            if(p[0]=='.') break;
            f[0]=f[1]=0;
            for(int i=1;i<n;i++){
                int j=f[i];
                while(j&&p[j]!=p[i]) j=f[j];
                f[i+1]=p[j]==p[i]?j+1:0;
            }
            if(n%(n-f[n])==0) printf("%d
    ",n/(n-f[n]));
            else printf("1
    ");
        }
    }
  • 相关阅读:
    BZOJ3732: Network
    BZOJ2705: [SDOI2012]Longge的问题
    BZOJ3712: [PA2014]Fiolki
    BZOJ3709: [PA2014]Bohater
    BZOJ3668: [Noi2014]起床困难综合症
    CoderForces985F-Isomorphic Strings
    CodeForces985C-Liebig's Barrels
    Open-Pit Mining
    Multiplication Game
    象棋
  • 原文地址:https://www.cnblogs.com/candy99/p/5978071.html
Copyright © 2020-2023  润新知