[KMP]洛谷 P4391 Radio Transmission 无线传输 题解

真心看不懂你谷的题解,进行思考之后决定自己写一篇。

首先我们要求的循环节一定公共前后缀为空,这很好理解对罢。

因为如果你的循环节有一个公共前后缀,很显然存在长度更小的解。

比如:

\(aabaa \rightarrow aab\) \(aab(可以用更小的循环节拼出来)\)

我们设这个循环节长度为 \(len\)\(kmp\) 为公共前后缀数组。

\(kmp_i = 0 (i = len)\)

\(kmp_i = i - len (i > len)\)

那么 \(kmp_n = n - len\)

答案即为 \(n - kmp_n\)

#include <bits/stdc++.h>
const int N = 1e6 + 7;
int n , pi[N];
std :: string s;
int main() {
	std :: cin >> n >> s;
	s = '&' + s;
	int j = 0;
	for(register int i = 1; i <= n; ++i) {
		while(s[j + 1] != s[i + 1] && j) {
			j = pi[j];
		}
		if(s[j + 1] == s[i + 1]) {
			++j;
		}
		pi[i + 1] = j;
	}
	std :: cout << n - pi[n];
	return 0;
}
posted @ 2025-04-13 12:28  「癔症」  阅读(14)  评论(0)    收藏  举报