传送门biu~
kmp算法中nex数组指向最长后缀,那么最短循环节一定就是n-nex[n]。
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int nex[1000005];
int main(){
cin>>n>>s;
nex[0]=nex[1]=0;
for(int i=1;i<n;++i){
int j=nex[i];
while(j && s[j]!=s[i]) j=nex[j];
if(s[j]==s[i]) nex[i+1]=j+1;
else nex[i+1]=0;
}
printf("%d",n-nex[n]);
return 0;
}