奥赛一本通 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;
}
posted @ 2026-09-23 16:49  萧西待水  阅读(10)  评论(0)    收藏  举报