擴展kmp入門---擴展kmp


最頭痛這個算法了 加上kmp 都學習了接近一個星期都不會 現在勉勉強強可以將模板打出來 

 辛苦辛苦,雖然菜,但還是要學會的。

過程:http://blog.csdn.net/Littlewhite520/article/details/77427017

圖片參考博客 :https://www.61mon.com/index.php/archives/186/


這個是求解next數組  和extend數組  

#include<iostream>
#include<string.h>
using namespace std;
string s,t;
int nt[1000],extend[1000];
int n,m,i,j;
void get_next(string &t,int nt[])
{
	int a=0,p=0;//  a是用來紀錄上一個點的匹配的公共綴 p爲當前字符的最遠的匹配的下標
	nt[0]=m; //第一個元素的值設置爲m總長度
	for(i=1;i<m;i++)
	{
		if(i>=p||i+nt[i-a]>=p) //當i大於p時 或者
		{
			if(i>=p)	p=i;//p如果小於i p只能從i處開始
			while(p<m&&t[p]==t[p-i])    p++;//意思就是將主串t的第i個開始匹配 t從0開始的字符串 因此需要用t[p]和t[p-i]比較是否相等 若相等則將p最遠距離拉遠可以得到當前字符的與t串的最長公共前綴長了
			nt[i]=p-i; //意思從當前i位置匹配了幾個與t串的相同的前綴
			a=i;
		}
		else nt[i]=nt[i-a];
	}
}
void get_extend(string &s,string &t,int extend[],int nt[])
{
	int a=0,p=0;
	get_next(t,nt);
	for(i=0;i<n;i++){
		if(i>=p||i+nt[i-a]>=p)
		{
			if(i>=p)    p=i;
			while(p<n&&p-i<m&&s[p]==t[p-i]) p++;
			extend[i]=p-i;
			a=i;
		}
		else extend[i]=extend[i-a];
	}
}


int main()
{
	while(cin>>s>>t)
	{
		n=s.size(),m=t.size();
		get_extend(s,t,extend,nt);
		cout<<"next數組:"<<endl;
		for(i=0;i<m;i++)
			cout<<nt[i]<<" ";
		cout<<endl<<"擴展kmp數組:"<<endl;
		for(i=0;i<n;i++)
			cout<<extend[i]<<" ";
	}
	return 0;
}
			


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章