最長公共前後綴(KMP中next數組求法)

字符串的前綴是指不包含最後一個字符的所有以第一個字符開頭的連續子串;後綴是指不包含第一個字符的所有以最後一個字符結尾的連續子串。例如對於字符串 abacaba,其前綴有 a, ab, aba, abac, abacab,後綴有bacaba, acaba, caba, aba, ba, a。最長公共前後綴就是 aba。現給出一個長度爲 N 的字符串 S,對於每個 M (0<=M<N),求出連續子串 S[0…M] 的最長公共前後綴。

輸入格式:
輸入數據僅有一行,包含一個長度不超過 100,000 的僅由字母 a-z 構成的字符串。

輸出格式:
對於每個 M (0,1,2,…,N−1),輸出對應的最長公共前後綴長度,以空格分隔,且行尾不得有多餘空格。

輸入樣例:
abcdabcdabce

輸出樣例:
0 0 0 0 1 2 3 4 5 6 7 0

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int Next[100001];
string s;
void getNext(){
	int j =0, k =-1;
    Next[0]=-1;   
        while(j < s.size()){
            if(k ==-1|| s[j]== s[k]){
            j++;
            k++;
            Next[j]= k;
     }
        else         
            k =Next[k];
     }
}
int main ()
{
	cin>>s;
	getNext();
	for(int i=1;i<=s.size();i++){
		if(i==1)
		printf("%d",Next[i]);
		else
		printf(" %d",Next[i]);
	}
	return 0;
}

發佈了105 篇原創文章 · 獲贊 117 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章