题目描述
给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。
输入
第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.
输出
请输出最短的长度
样例输入
8
cabcabca
样例输出
3
和前一题一样直接求最小循环子串就行
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
int ne[N],maxx=0;
char a[N];
int l1,l2;
void cal_ne(char a[]){
ne[1]=0;
int k=0;
for(int i=2;i<=l1;i++){
while(k&&a[k+1]!=a[i])
k=ne[k];
if(a[k+1]==a[i])
k++;
ne[i]=k;
}
}
int main() {
cin>>l1;
for(int i=1;i<=l1;i++)
cin>>a[i];
maxx=1;
cal_ne(a);
l2=l1-ne[l1];
cout<<l2<<endl;
}