奥赛一本通 1467 Radio Transmission
1467 Radio Transmission
题目大意
给定一个字符串,求一个长度尽可能短的串,使得原先的串是这个短串重复若干次之后的子串。
知识要点
KMP
解题思路
首先,求解的这个短串一定可以是原串的前缀,如果不是前缀的话,将这个短串前面的几个字符挪到末尾即可。那么短串重复若干次之后的前缀就是原串,结合 border 的性质即可求解循环长度。
参考代码
#include <bits/stdc++.h>
using namespace std;
char s[1000005];
int n, f[1000005];
int main() {
scanf("%d%s", &n, s);
for(int i = 1, j = 0; i < n; i++) {
while(j && s[i] != s[j]) j = f[j - 1];
if(s[i] == s[j]) j++;
f[i] = j;
}
printf("%d\n", n - f[n - 1]);
return 0;
}

浙公网安备 33010602011771号