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;
}
依旧是简单的模板变形,引入了一个经典问题,最小循环节,理解了之后用n-ne【n】秒了就行
posted @ 2025-11-30 17:02  gosaky  阅读(1)  评论(0)    收藏  举报