码迷,mamicode.com
首页 > 编程语言 > 详细

KMP中next数组的应用

时间:2020-07-14 13:10:25      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:get   ima   mes   坑点   https   bsp   amp   http   its   

技术图片

 

 

KMP算法中,求了一个前缀函数:技术图片 为前 技术图片 个字符组成的子串中、真前缀、真后缀相等的最大长度。
例如对于abcabcd

  1. a,技术图片,没有真前后缀。
  2. ab,技术图片
  3. abc,技术图片
  4. abca,技术图片
  5. abcab,技术图片
  6. abcabc,技术图片
  7. abcabcd,技术图片

那么对于给出的字符串求 技术图片 数组后,前后缀相等的最大长度即为 技术图片
并且只要途中出现过 技术图片,就说明途中出现了一次与前后缀相同的字符串。

除此之外的一个坑点:技术图片 可能大于所有 技术图片,因此出现此种情况时缩短所取前后缀的长度: 技术图片,直到存在 技术图片
如果缩短后 技术图片,说明无解。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=200005;
int Next[MAXN];
char str[MAXN],vis[MAXN],strf[MAXN];
int cnt;
int getFail(char *p,int plen){
    Next[0]=0,Next[1]=0;
    for(int i=1;i<plen;i++){
        int j=Next[i];
        while(j&&p[i]!=p[j]) j=Next[j];
        Next[i+1]=(p[i]==p[j])?j+1:0;
    }
    return 0; 
}

int main(){
        scanf("%s",str);
        int n=strlen(str);
        getFail(str,strlen(str));
        for(int i=1;i<strlen(str);i++)vis[Next[i]]=1;
        int temp=Next[n];
        while(temp){
            if(vis[temp]){
                for(int i=0;i<temp;i++){
                    cout<<str[i];
                }
                return 0;
            }
            else{
                temp=Next[temp];
            }
        }
        
        return 0; 
}

 

KMP中next数组的应用

标签:get   ima   mes   坑点   https   bsp   amp   http   its   

原文地址:https://www.cnblogs.com/LH2000/p/13298325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!