[BZOJ1355][Baltic2009]Radio Transmission
[BZOJ1355][Baltic2009]Radio Transmission
试题描述
给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.
输入
第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.
输出
输出最短的长度
输入示例
8 cabcabca
输出示例
3
数据规模及约定
见“输入”
题解
就是找到最大的 boarder,然后用总长度减去它的长度就是最小周期。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <algorithm> using namespace std; int read() { int x = 0, f = 1; char c = getchar(); while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); } while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); } return x * f; } #define maxn 1000010 char S[maxn]; int Fail[maxn]; int main() { int n = read(); scanf("%s", S + 1); for(int i = 2; i <= n + 1; i++) { int j = Fail[i-1]; while(j > 1 && S[j] != S[i-1]) j = Fail[j]; Fail[i] = S[j] == S[i-1] ? j + 1 : 1; } printf("%d\n", n + 1 - Fail[n+1]); return 0; }