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