#10045. 「一本通 2.2 练习 1」Radio Transmission

题目

题目描述

给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

输入格式

第一行给出字符串的长度 L,第二行给出一个字符串,全由小写字母组成。

输出格式

输出最短的长度。

样例

输入

8
cabcabca

输出

3

代码详解

大致思路

n-p[n]就是周期长度
直接输出就好

ACcode

#include
using namespace std;
const int N=1e7;
char a[N];
int p[N];
int n,l;
void pre(){
	p[1]=0;
	int j=0;
	for(int i=1;i<n;i++){
		while(j>0&&a[j+1]!=a[i+1]){
			j=p[j];
		}
		if(a[j+1]==a[i+1]){
			j++;
		}
		p[i+1]=j;
	}
}
int main()
{
	cin>>l;
	cin>>a+1;
	n=strlen(a+1);
	pre();
	printf("%d\n",n-p[n]);
	return 0;
}

end

你可能感兴趣的:(c++,KMP,算法)