zoukankan      html  css  js  c++  java
  • UVA1328 Period

    思路

    KMP算法的next数组是该字符串的最长的相同的前缀和后缀的长度
    所以i-next[i]是最小的循环节长度
    然后如果next[i]不为0,则证明一定有循环(不一定完整)
    然后如果整除,就是完整的循环了

    代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int T,n,nxt[1000100];
    char s[1000100];
    void get_fail(char *s){
        nxt[0]=0;
        nxt[1]=0;
        int j=0;
        for(int i=1;i<n;i++){
            j=nxt[i];
            while(s[j]!=s[i]&&j)
                j=nxt[j];
            if(s[j]!=s[i])
                nxt[i+1]=0;
            else
                nxt[i+1]=j+1;
        }
    }
    int main(){
        int cnt=0;
        while(scanf("%d",&n)&&n){
            cnt++;
            memset(nxt,0,sizeof(nxt));
            scanf("%s",s);
            get_fail(s);
            printf("Test case #%d
    ",cnt);
            for(int i=2;i<=n;i++){
                if((nxt[i])&&(i%(i-nxt[i])==0))
                    printf("%d %d
    ",i,i/(i-nxt[i]));
            }
            putchar('
    ');
        }
        return 0;
    }
    
  • 相关阅读:
    大于00
    today
    10
    面试题flask
    开发者日志
    7月22日一天学的东西
    资料
    3333
    2222
    1
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10691033.html
Copyright © 2011-2022 走看看