萌新初学字符串,求助 KMP 板子,RE 了
查看原帖
萌新初学字符串,求助 KMP 板子,RE 了
118196
zimujun楼主2020/12/16 21:04

RT

我写的是下标 0 开始的,根据自己的理解,可能写的比较奇怪

发现如果模式串的最后一项如果是 -1,模式串和文本串进入了部分匹配的话就会 RE

#include <bits/stdc++.h>

using namespace std;

const int Maxn = 1e6 + 5;

int prefix[Maxn];

string text, pattern;

int ans;

inline void Init() {
	prefix[0] = -1;
	for(register int i = 1; i < pattern.size(); ++i) {
		int j = prefix[i - 1];
		while(pattern[j + 1] != pattern[i] && j != -1) j = prefix[j];
		prefix[i] = (pattern[j + 1] == pattern[i] ? j + 1 : -1); 
	}
}

int main() {
	cin >> text >> pattern;
	Init();
	int j = 0;
	for(register int i = 0; i < text.size(); ++i) {
		while((text[i] != pattern[j]) && (j > 0)) j = prefix[j - 1] + 1;
		if(j == pattern.size() - 1) {printf("%d\n", i - pattern.size() + 2); j = prefix[j] + 1;}
		else j++;
	}
	for(register int i = 0; i < pattern.size(); ++i) printf("%d ", prefix[i] + 1);
	return 0;
}
2020/12/16 21:04
加载中...