zoukankan      html  css  js  c++  java
  • HDU 1358 Period (kmp求循环节)(经典)

    <题目链接>

    题目大意:

    意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)

    的两次组成,也就是aa有两个a组成;

    第三行自然就是aabaab可有两个aab组成;

    第四行aabaabaab可由三个aab组成;

    第五行aabaabaabaab可有四个aab组成

    解题分析:

    求字符串的前缀是否为周期串,若是,打印循环节的长度及循环次数;

    #include <cstdio>
    #include <cstring>
    
    const int M =1e6+100;
    char s[M];
    int nxt[M],n;
    void getnext(){
        int i=0,j=-1;
        nxt[0]=-1;
        while(i<n){
            if(j==-1||s[i]==s[j])
                nxt[++i]=++j;
            else
                j=nxt[j];
        }
    }
    int main(){
        int ncase=0;
        while(scanf("%d",&n)!=EOF,n){
            scanf("%s",s);
            getnext();
            printf("Test case #%d
    ",++ncase);
            for(int i=1;i<=n;i++){    //注意这里不能把n 写成strlen(s),会超时!!!
                int len=i-nxt[i];     //len代表最小循环节
                if(i%len==0&&i/len>1)  //  i/len代表循环次数 
                    printf("%d %d
    ",i,i/len);
            }
            printf("
    ");
        }
        return 0;
    }

    2018-08-04

  • 相关阅读:
    Tempter of the Bone
    CODE[VS]1160 蛇形矩阵
    CODE[VS] 1205 单词翻转
    CODE[VS] 1204 寻找子串位置
    a little sweet~
    我多喜欢你,你会知道
    P1474 货币系统 Money Systems
    P1096 Hanoi双塔问题
    P1209 [USACO1.3]修理牛棚 Barn Repair
    下一秒
  • 原文地址:https://www.cnblogs.com/00isok/p/9420428.html
Copyright © 2011-2022 走看看