POJ-2752(KMP算法+前缀数组的应用)
阅读原文时间:2023年07月10日阅读:2

Seek the Name, Seek the Fame

  • 本题使用的算法还是KMP

  • 最主要的片段就是前缀数组pi的理解,这里要求解的纸盒pi[n-1]有关,但是还是需要使用一个循环来依次找到前面符合的前缀(所谓符合就是可以保持既是前缀也是s的后缀的子串长度)。

    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    const int N=400005;
    int pi[N];
    void Pi(string s){
    memset(pi,0,sizeof(pi));
    int n=s.length();
    pi[0]=0;
    for(int i=1;i0&&s[i]!=s[j]){
    j=pi[j-1];
    }
    if(s[i]==s[j])
    j++;
    pi[i]=j;
    }
    }
    int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    while(cin>>s){
    set se;
    Pi(s);
    int n=s.length();
    if(n==1){
    cout<<1<0){
    if(s[n-1]==s[j]){
    se.insert(j+1);
    }
    j=pi[j-1];
    }
    se.insert(n);
    if(s[0]==s[n-1])
    se.insert(1);
    int k=0;
    int cnt=(int)se.size();
    for(set::iterator it=se.begin();it!=se.end();it++){
    if(k++==cnt-1)
    cout<<it<it<<" ";
    }
    }
    return 0;
    }

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器