题目描述
给你一个字符串 s_1s1,它是由某个字符串 s_2s2 不断自我连接形成的。但是字符串 s_2s2 是不确定的,现在只想知道它的最短长度是多少。
输入格式
第一行一个整数 LL,表示给出字符串的长度。
第二行给出字符串 s_1s1 的一个子串,全由小写字母组成。
输出格式
仅一行,表示 s_2s2 的最短长度。
输入输出样例
输入
8
cabcabca
输出
3
说明/提示
样例输入输出 1 解释
对于样例,我们可以利用 \texttt{abc}abc 不断自我连接得到 \texttt{abcabcabc}abcabcabc,读入的 \texttt{cabcabca}cabcabca,是它的子串。
规模与约定
对于全部的测试点,保证 1 < L \le 10^61<L≤106。
思路:KMP的原始next数组,然后求得(n-next[n]),为最短的连接字符串,即为答案。
代码如下:
#include<stdio.h>//同样的算法换成c++就AC了,c就只有77%
#include<string.h>
#define N 100010
int main()
{
int n;
char a[N];
int p[N];
int s,i,j=0;
scanf("%d",&n);
scanf("%s",(a+1));
s=strlen(a+1);
for(int i=2; i<=s; ++i)
{
while(j&&a[j+1]!=a[i])
{
j=p[j];
}
if(a[j+1]==a[i])
{
j++;
}
p[i]=j;
}
printf("%d\n",n-p[n]);
return 0;
}