【代码超详解】洛谷 P3375 【模板】KMP字符串匹配(总时间:229 ms)

一、题目描述

提交 46.03k 通过 20.66k 时间限制 1.00s 内存限制 125.00MB
【代码超详解】洛谷 P3375 【模板】KMP字符串匹配(总时间:229 ms)_第1张图片

二、算法分析说明与代码编写指导

【代码超详解】洛谷 P3375 【模板】KMP字符串匹配(总时间:229 ms)_第2张图片【代码超详解】洛谷 P3375 【模板】KMP字符串匹配(总时间:229 ms)_第3张图片【代码超详解】洛谷 P3375 【模板】KMP字符串匹配(总时间:229 ms)_第4张图片

三、AC 代码

总时间:229 ms(C++17 O2)

#include
#include
#pragma warning(disable:4996)
template<class _Nty> inline void getnext(const char* const p, _Nty* const Next, const _Nty& lp) {
	_Nty i = 1, j = 0; Next[1] = 0;
	while (i <= lp) {
		if (j == 0 || p[i] == p[j]) { ++i, ++j, Next[i] = j; }
		else j = Next[j];
	}
}//The index of the head of p string is 1.
template<class _Nty, class _Rty = unsigned> inline _Rty KMP(const char* const t, const char* const p, _Nty* const Next, const _Nty& lt, const _Nty& lp) {
	_Rty c = 0; _Nty i = 1, j = 1;
	Next[1] = 0; getnext(p, Next, lp);
	while (i <= lt) {
		if (j == 0 || t[i] == p[j]) { ++i, ++j; }
		else j = Next[j];
		if (j > lp) { ++c, j = Next[j]; printf("%u\n", i - lp); }
	}
	return c;
}//The index of the head of p string is 1.
char t[1000002], p[1000002]; unsigned next[1000002], lp;
int main() {
	scanf("%s%s", t + 1, p + 1); lp = strlen(p + 1); KMP(t, p, next, (unsigned)strlen(t + 1), lp); ++lp;
	for (unsigned long long i = 2; i <= lp; ++i) { printf("%u ", next[i] - 1); }
	putchar('\n');
	return 0;
}

你可能感兴趣的:(ACM-ICPC)