テンプレート-KMP(次の配列の初期化(バージョン1))

#include<iostream>
using namespace std;

typedef long long ll;
const int maxn = 1e6 + 10;

int Next[maxn];		//用来存放字符串p的最长公共前缀后缀

void Build_Next(char* p, int n) {
    
    
	Next[0] = 0;		//前1个字母只有一个字母
	int len = 0;
	int i = 1;
	while (i < n) {
    
    
		if (p[i] == p[len]) {
    
    		//如果匹配成功,长度加加
			len++;
			Next[i] = len;
			i++;
		}
		else {
    
    
			if (len > 0)		//防止len越界
				len = Next[len - 1];
			else {
    
    		//当len = 0时,跳出本次循环
				Next[i] = 0;
				i++;
			}
		}
	}
}

int main() {
    
    

	char s[] = "ABABCABAA";
	int n = 9;

	Build_Next(s, n);
	for (int i = 0; i < n; i++) {
    
    
		cout << Next[i] << " ";
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_45739057/article/details/105309352