zoukankan      html  css  js  c++  java
  • poj 2406 Power Strings(kmp)

    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

    题意:给你定义字符串的幂 然后给你一个串s 问 幂次最大为多少

    思路:找到字符串的循环节 然后看下有没有满足的循环节 没有就输出1

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<stack>
    #include<bitset>
    #include<cstdlib>
    #include<cmath>
    #include<set>
    #include<list>
    #include<deque>
    #include<map>
    #include<queue>
    #define ll long long int
    using namespace std;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
    int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
    const int inf=0x3f3f3f3f;
    const ll mod=1e9+7;
    char s[1000007];
    int nextt[1000007];
    void getnext(){
        nextt[1]=0;
        int len=strlen(s);
        for(int i=2,j=0;i<=len;i++){
            while(j>0&&s[i-1]!=s[j]) j=nextt[j];
            if(s[i-1]==s[j]) j++;
            nextt[i]=j;
        }
    }
    int main(){
        //ios::sync_with_stdio(false);
        while(~scanf("%s",s)){
            if(strlen(s)==1&&s[0]=='.') break;
            getnext();
            int len=strlen(s);
            int temp=nextt[len];
            while(len%(len-temp)!=0){
                temp=nextt[temp];
                if(len/(len-temp)<2)
                break;
            }
            if(len%(len-temp)==0)
            printf("%d
    ",len/(len-temp));
            else printf("1
    ");
        }
        return 0;
    }
  • 相关阅读:
    HDU 5059 Help him
    HDU 5058 So easy
    HDU 5056 Boring count
    HDU 5055 Bob and math problem
    HDU 5054 Alice and Bob
    HDU 5019 Revenge of GCD
    HDU 5018 Revenge of Fibonacci
    HDU 1556 Color the ball
    CodeForces 702D Road to Post Office
    CodeForces 702C Cellular Network
  • 原文地址:https://www.cnblogs.com/wmj6/p/10496519.html
Copyright © 2011-2022 走看看