POJ 2752 深刻理解KMP失配指针

思路:刚开始还在想怎么做,虽然以前是理解了失配指针的用处,但是确实不知道失配指针还有如此用处,其实还有很多用处,我用得少了不懂而已。

比如:

i   0  1  2  3  4  5   6  7  8  9  10 11

p[i]  A  B R A  C  A  D  A  B  R  A  无

next[i]  0  0  0  0  1  0   1  0  1   2  3   4

next[11]=4这个肯定可以取了,因为这个后缀等于前缀嘛,然后再查询next[next[11]]=next[4]=1,即ABRA的后缀等于前缀的个数为1,而字符串p后缀也有ABRA,所以求第4个位置的next值即整个字符串后缀等于前缀的下一个值……然后一下个值再求next[next[4]]=next[1]=0就是下一个后缀等于前缀的个数了。如此循环下去即可。

这样说理解了吧。next失配数组确实太强大了!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffffffffffff
#define maxn 400050
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
char s[maxn];
int next[maxn],len,a[maxn];
void getfail()
{
    len=strlen(s);
    next[0]=next[1]=0;
    for(int i=1;i<len;i++)
    {
        int j=next[i];
        while(j&&s[i]!=s[j]) j=next[j];
        next[i+1]=s[i]==s[j]?j+1:0;
    }
}
int main()
{
    //freopen("1.txt","r",stdin);
    while(~scanf("%s",s))
    {
        getfail();
        int cnt=0;
        a[cnt++]=len;
        while(next[len])
        {
            a[cnt++]=next[len];
            len=next[len];
        }
        for(int i=cnt-1;i>0;i--)
            printf("%d ",a[i]);
        printf("%d\n",a[0]);
    }
    return 0;
}

POJ 2752 深刻理解KMP失配指针

时间: 2024-12-27 12:00:14

POJ 2752 深刻理解KMP失配指针的相关文章

Seek the Name, Seek the Fame POJ - 2752(拓展kmp)

题意: 就是求前缀和后缀相同的那个子串的长度  然后从小到大输出 解析: emm...网上都用kmp...但...我..用拓展kmp做的  这就是拓展kmp板题嘛... 求出extend数组后  把extend[i] == len - i 的放到vector中 最后排序输出就好了 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <m

POJ 2752 Seek the Name, Seek the Fame KMP题解

本题是KMP的next数组的灵活运用. 具体就是看最后整个数列的最后一个字母,能有多少前缀. 理解了next数组就很容易了. #include <stdio.h> #include <string.h> #include <vector> using std::vector; const int MAX_N = 400001; char name[MAX_N]; int next[MAX_N], len; void genNext() { for (int i = 1,

poj 2752 Seek the Name, Seek the Fame KMP

对于KMP算法中next函数的应用 题意是对于一个字符串的前缀和后缀比较是否相等,再把相等的可能按字符串长度进行输出 #include <iostream> #include<stdio.h> #include<string.h> using namespace std; int len; int next[1000005]; char s[1000005]; int kmp_next() { int i=0,j=-1; next[0]=-1; while(i<l

ZOJ 3643 kmp+栈处理失配指针

当kmp在母串中匹配到子串之后,删去子串相当于把失配指针往回退到匹配位置的前一个,如果只回退一次的话,直接用数组就可以处理失配指针了,但是本题可能删除后存在多个子串,所以用栈把失配指针位置先存起来,然后找到一次把len长度的失配指针删去,然后栈顶元素就是第一句话说的回退出匹配位置的前一个了. 为了方便调用函数,把以前的kmp改成了接口,方便使用,这样就不用开全局变量的数组了,代码看起来更符合工作中开发的代码风格. #include <iostream> #include <cstdio&

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher H - Seek the Name, Seek the Fame POJ - 2752(kmp的next数组应用)

H - Seek the Name, Seek the Fame POJ - 2752 题目链接:https://vjudge.net/contest/70325#problem/H 题目: The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. Th

从头到尾彻底理解KMP

从头到尾彻底理解KMP 本文转自:http://blog.csdn.net/v_july_v/article/details/7041827 作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进.后收录于新书<编程之法:面试和算法心得>第4.4节中. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够

从头到尾彻底理解KMP(2014年8月22日版)

从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. 然近期因在北京开了个算法班,专门讲解数据结构.面试.算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解.以及跟我一起讲算法的两位讲师朋友曹博

从头到尾彻底理解KMP(2014年8月15日版)

从头到尾彻底理解KMP 作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱,如此,留言也是"骂声"一片.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. 然近期因在北京开了个算法班,专门讲解数据结构.面试.算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解.

【转载】从头到尾彻底理解KMP

转自:http://www.cnblogs.com/zhangtianq/p/5839909.html 转自:http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写