POJ2752

傳送門:POJ2752

傻逼題,注意前綴函數的定義就行了。

代碼上的小細節見下。

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

int ans[1000005];
int f[1000005];
int tot;

void Make_Table(string a)
{
    f[0]=-1;int k=-1,len=a.length();
    for(int i=1;i<len;i++){
        while(k>=0&&a[k+1]!=a[i])
            k=f[k];
        if(a[k+1]==a[i])
            k++;
        //printf("%d\n",i);
        f[i]=k;
    }
}

void GetAns(string a)
{
    int i=a.length();
    i--;
    while(i!=-1){
        if(a[i]!=a[a.length()-1])
            break;
        ans[++tot]=i+1;
        i=f[i];
    }
    for(int j=tot;j>=1;j--)
        printf("%d ",ans[j]);
    printf("\n");
}

void Solve()
{
    freopen("loli.in","r",stdin);
    string a;
    while(cin>>a){
        Make_Table(a);
        GetAns(a);
        tot=0;
    }
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Solve();
    Close();
    return 0;
}
發佈了54 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章