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

 

posted @ 2017-03-01 07:42  xjr01  阅读(198)  评论(0编辑  收藏  举报