1. 程式人生 > 實用技巧 >BZOJ-1355 [Baltic2009]Radio Transmission(KMP求最小迴圈節)

BZOJ-1355 [Baltic2009]Radio Transmission(KMP求最小迴圈節)

題目描述

  給一個長為 \(n(1\leq n\leq 10^6)\) 的字串,它是由某個字串不斷自我連線形成的。但是這個字串是不確定的,求它的最短長度。

分析

  經典結論:最小迴圈節長度為 \(n-\text{Next}[n]\)

程式碼

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char str[N+10];
int Next[N+10],n;
void get_next()
{
    int j=0;
    for(int i=2;i<=n;i++)
    {
        while(j>0&&str[i]!=str[j+1])
            j=Next[j];
        if(str[i]==str[j+1])
            j++;
        Next[i]=j;
    }
}
int main()
{
    cin>>n;
    scanf("%s",str+1);
    get_next();
    cout<<n-Next[n]<<endl;
    return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char str[N+10];
int Next[N+10],n;
void get_next()
{
    int j=0;
    for(int i=1;i<n;i++)
    {
        while(j>0&&str[i]!=str[j])
            j=Next[j-1];
        if(str[i]==str[j])
            j++;
        Next[i]=j;
    }
}
int main()
{
    cin>>n;
    scanf("%s",str);
    get_next();
    cout<<n-Next[n-1]<<endl;
    return 0;
}
*/