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

原文地址:https://www.cnblogs.com/00isok/p/9420428.html