[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;
}