zoukankan      html  css  js  c++  java
  • H

    题目传送(http://poj.org/problem?id=2406):

    题目描述

    定义两个字符串s1和s2的乘积s1*s2为将s1和s2连结起来得到的字符串。 
    例如:s1="xy",s2="z",那么s1*s2="xyz"。 
    由此可以定义s1的幂次:s1^0="",s1^n=s1*s1^(n-1),n>0。

    输入

    输入包含多组测试数据。 
    每组数据由一行构成,包含一个字符串s。 
    输入数据以"."结束。

    输出

    对于每组输入数据输出一行,找出最大的正整数n,使得存在某个字符串a,s = a^n.

    样例输入

    aaad
    aaaa
    ababab
    .
    

    样例输出

    1
    4
    3
    

    数据范围1≤s的长度≤1,000,000Hint

    不要使用cin读取数据
     
     
    代码如下(改代码来源于网络):
     
     

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;

    const int maxn = 1000005;
    char s[maxn];
    int next[maxn];

    int main() {
    while(~scanf("%s", s)&&s[0]!='.'){
    next[0] = -1;//初始化
    int len = strlen(s);//测长;
    int i = 0, j = -1;//初始化;
    while(i < len){//保证判断完最后一个字符跳出;
    //这里本人当时看了很久才看懂,其实只要带几个测试数据跟着代码走一遍就懂了;
    /*
    大概就是:i,j都是第几个字符,输入的第一个是s[0],所以i初始化为0,
    这里的比较是后面的与前面的比较,所以j初始化为-1;
    这里比较是先用next[i]=j来记录第i个字符与第j个相等;
    然后判断第i个字符与前面第j个字符比较是否相等,若不相等,j复位为-1;
    若相等,接着判断i+1与j+1是否相等......
    由于第一个字符的角标为0所以这里是先用 next[i]=j来记录第i个字符与第j个相等,
    这样的话判断完最后next[len]就是第一个字符到倒数第二个周期的最后一个字符的长度,
    用总长度减去next[len]就是剩下的最后一个周期也就是该字符串的最大周期;
    最后用总长度除以最大周期就是结果;
    */
    if(j == -1 || s[i] == s[j]) next[++ i] = ++ j;
    else j = next[j];
    }
    if(len % (len - next[len]) == 0) printf("%d ", len / (len - next[len]));
    else printf("1 ");
    }
    return 0;
    }

  • 相关阅读:
    vue-cli快速搭建
    js严格模式下判断数据类型
    js实现本地的图片压缩上传预览
    web端实现图片放大切换显示预览
    swiper.js在隐藏/显示切换时,轮播出现bug的解决办法
    Zepto.js实现fadeIn,fadeOut功能
    ms
    redis 解决秒杀
    单下滑线 事务 锁
    极验
  • 原文地址:https://www.cnblogs.com/sunowsir/p/6687209.html
Copyright © 2011-2022 走看看