POJ-2752 Seek the Name, Seek the Fame

一道简单的KMP算法的题,只要了解KMP的原理就能解出来

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

#define maxn 400005

int next[maxn];
int ans[maxn];
void kmp(string &s)
{
    next[0] = -1;
    int k = -1, p = 0;

    while(p < s.size())
    {
        if(k == -1 || s[k] == s[p])
        {
            k++;
            p++;
            next[p] = k;
        }
        else
          k = next[k];
    }
}
int main()
{
//  freopen("in.txt", "r", stdin);
    string s;

    while(cin >> s)
    {
        kmp(s);
        int n = 0, t = s.size();

        while(next[t])
        {
            ans[n++] = next[t]; 
            t = next[t];
        }
        for(int i = n-1; i >= 0; i--)
          cout << ans[i] << " ";
        cout << s.size() << endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值