P4391 无线传输
点击查看代码
//最小循环节问题,实质也就是模板的简单变形了
//可以反过来推导一串字符cabca平移多长才能再使得之后的头和原先的尾重合,答案就是平移最小循环节的长度,因为最小循环节就是最小不重复片段,越过了最小不重复片段就可以相等了
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char p[N];
int ne[N];
int n;
int main()
{
scanf("%d ",&n);
scanf("%s",p+1);
for(int i=2,j=0;i<=n;i++){
while(j&&p[j+1]!=p[i]) j=ne[j];
if(p[j+1]==p[i]) j++;
ne[i]=j;
}
cout<<n-ne[n]<<endl;
return 0;
}

浙公网安备 33010602011771号