题目描述
给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.
输入输出格式
输入格式:
第一行给出字符串的长度,1 < L ≤ 1,000,000.
第二行给出一个字符串,全由小写字母组成.
输出格式:
输出最短的长度
输入输出样例
输入样例#1:
8
cabcabca
输出样例#1:
3
【说明】:
对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串
【解题思路】:
设循环节的长度为x,那么kmp数组前x个都是0,后面kmp[x+n]=n
先求出kmp数组
答案实际就是len-kmp[len]
【AC代码】:
#include<bits/stdc++.h>
#define M(a,b) memset(a,b,sizeof(a))
#define pi 3.1415926
using namespace std;
int n,i,k;
int kmp[1000005];
char a[1000005];
int main(){
scanf("%d %s",&n,a);
kmp[0]=kmp[1]=0;
for(i=1;i<n;i++){
while(k&&a[i]!=a[k])k=kmp[k];
kmp[i+1]=a[i]==a[k]?++k:0;
}
printf("%d",n-kmp[n]);
return 0;
}