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;
    }
  • 相关阅读:
    Linux目录图解
    Linux-Monitor-Tools
    常用系统及工具下载
    vim 编辑器常规使用
    Win10 安装.NET framework 3.5
    Apache 2.4.6 新增虚拟目录
    html5
    CentOS 7 修改ssh端口
    CentOS7 设置密码复杂度
    CentOS 7安装 hping
  • 原文地址:https://www.cnblogs.com/wmj6/p/10496519.html
Copyright © 2011-2022 走看看