hdu1358(循環節)


#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int knext[1000000+100];
void get_kmp(string s,int len){
    int i = 0;
    int j = -1;
    knext[0] = -1;
    while(i<len){
        while(j!=-1&&s[i]!=s[j])j = knext[j];
        knext[++i] = ++j;
    }
}
int main(){
    int n;
    string s;
    int cnt = 1;
    while(scanf("%d",&n)&&n){
        cin>>s;
        int len = s.size();
        get_kmp(s,len);
//        for(int i = 0;i<=len;++i){
//            printf("%d ",knext[i]);
//        }
//        cout<<endl;
        printf("Test case #%d\n",cnt++);
        for(int i =0;i<len;++i){
            if(knext[i+1]%(i+1-knext[i+1])==0&&knext[i+1]!=0){
                printf("%d %d\n",i+1,(i+1)/(i+1-knext[i+1]));
            }
        }
        cout<<endl;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章