HDOJ-1358(字符串压缩+KMP)

Period

HDOJ-1358

这题还是属于KMP算法的应用,属于字符串压缩问题。也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int n;
string a;
int pi[1000010];
void Pi(string s){
    memset(pi,0,sizeof(pi));
    int n=s.length();
    pi[0]=0;
    for(int i=1;i<n;i++){
        int j=pi[i-1];
        while(j>0&&s[i]!=s[j]){
            j=pi[j-1];
        }
        if(s[i]==s[j])
            j++;
        pi[i]=j;
    }
}
int main(){
    int t=0;
    while(cin>>n&&n){
        cin>>a;
        Pi(a);
        cout<<"Test case #"<<++t<<endl;
        for(int i=2;i<=n;i++){
            //cout<<pi[i-1]<<endl;
            int k=i-pi[i-1];
            if(i%k==0&&pi[i-1]!=0){
                cout<<i<<" "<<i/k<<endl;
            }
        }
        cout<<endl;
    }
    return 0;
}
posted @ 2019-08-09 11:12  Garrett_Wale  阅读(149)  评论(0编辑  收藏  举报