扩展KMP模板

Posted zjj0624

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展KMP模板相关的知识,希望对你有一定的参考价值。

扩展KMP
扩展KMP是一种解决字符串的数据结构,我们假设母串为S,长度为n,子串为T,长度为m,让我们求出所有S的后缀子串与T的最长公共前缀,也就是求出S(i,n)与T(1,m)的最长公共前缀,定义成一个数组就是 e x t e n d [ i ] extend[i] extend[i]
扩展KMP就是求这个extend[i].
具体extend的求法就不具体写了,这里只写求extend的模板.
模板
用到的数组

char T[N]; //子串
char S[N]; //母串
int next[N];//辅助数组next
int extend[N];//extend数组

求extend数组


void EXTEND_KMP ()

	int lens = strlen (S);
	int lent = strlen (T);
	next[0] = lent;
	int i, j, p, L;
	j = 0;
	while (j + 1 < lent && T[j] == T[j + 1])
	
		++j;
	
	next[1] = j;
	int a = 1;
	for (i = 2; i < lent; ++i)
	
		p = next[a] + a - 1;
		L = next[i - a];
		if (i + L < p + 1)
		
			next[i] = L;
		
		else
		
			j = max(0, p - i + 1);
			while (i + j < lent && T[i + j] == T[j])
			
				++j;
			
			next[i] = j;
			a = i;
		
	
	j = 0;
	while (j < lens && S[j] == T[j])
	
		++j;
	
	extend[0] = j;
	a = 0;
	for (i = 1; i < lens; ++i)
	
		p = extend[a] + a - 1;
		L = next[i - a];
		if (L + i < p + 1)
		
			extend[i] = L;
		
		else
		
			j = max(0, p - i + 1);
			while (i + j < lens && j < lent && S[i + j] == T[j])
			
				++j;
			
			extend[i] = j;
			a = i;
		
	

以上是关于扩展KMP模板的主要内容,如果未能解决你的问题,请参考以下文章

扩展KMP模板

扩展KMP模板

kmp与扩展kmp模板

扩展KMP模板

KMP算法——next数组求法

扩展KMP模板