POJ2752 Seek the Name, Seek the Fame(KMP,前后缀匹配

题目来源:http://poj.org/problem?id=2752

题目描述:

题意:

给定一个字符串s,求有哪些长度的s的前缀,同时也是s的后缀。

思路:

对于字符串s的第i个字符s[i]next[i]定义为字符s[i]前面最多有多少个连续的字符和字符串s从初始位置开始的字符匹配。那么我们可以从后到前匹配前缀和后缀,如果前缀与后缀匹配,则下一个前缀与后缀匹配的字符串必然在前缀中。不断递归next数组即可求解。

参考代码:

#include <iostream>
using namespace std;
const int N=4e5+10;
#define end '\n'
#define IOS ios::sync_with_stdio(0)
int nxt[N],len,ans[N];
string s;
void get_next(string p) {
    len = p.size();
    int j = 0, k = -1;
    nxt[0] = -1;
    while (j < len) {
        if (k == -1 || p[j] == p[k]) {
            nxt[++j] = ++k;
        } else {
            k = nxt[k];
        }
    }
}
int main() {
    IOS;
    while (cin >> s) {
        get_next(s);
        /*从字符串的尾部开始,下一个前后缀匹配的串只能在与后缀相同的前缀字符串中*/
        int sum = 0;
        int t = nxt[len - 1];
        while (t != -1) {
            if (s[t] == s[len - 1])
                ans[sum++] = t + 1;
            t = nxt[t];
        }
        for (int i = sum - 1; i >= 0; i--) {
            cout << ans[i] << " ";
        }
        cout << len << end;
    }
    return 0;
}
全部评论

相关推荐

06-23 23:49
中南大学 Java
成绩一坨屎,英语6级没过,没读研,没考教资,没考计算机二级,没考公,没谈过恋爱,你们说我的这个大学生涯是不是混的有点失败啊?哎老中一生的容错还是太低了下辈子一定注意混好大学生涯不留遗憾
K1einMoretti:1.不保研 成绩没太大用 2.6级没过看用人企业要求了,基本上只要4级以上 3. 读不读研看自己选择,现在这环境螚先就业就先就业 4. 你不当老师考啥教资 5. 计算机二级没用(这证纯给国家上供) 6. 订婚***案了解一下?
点赞 评论 收藏
分享
05-20 21:57
已编辑
门头沟学院 Java
喜欢吃卤蛋的悲伤蛙在提需求:建信融通没消息吧,我2说有实习挂简历不理了
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
点赞 评论 收藏
分享
06-23 18:25
沈阳大学 Java
HR已读不回,是我说话方式不对吗?
大白之主:你是串子吗? hr: 我们不招人了,把岗位挂着boss只是因为我闲得慌
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务