1. 程式人生 > >【題解】Luogu P4391 [BOI2009]Radio Transmission 無線傳輸

【題解】Luogu P4391 [BOI2009]Radio Transmission 無線傳輸

原題傳送門

這題需要用到kmp匹配

推導發現:

設迴圈節的長度為x,那麼kmp陣列前x個都是0,後面kmp[x+n]=n

先求出kmp陣列

答案實際就是len-kmp[len]

#include <bits/stdc++.h>
#define N 1000005
using namespace std;
char a[N];
int kmp[N];
int main()
{
    int n;
    scanf("%d%s",&n,a);
    kmp[0]=kmp[1]=0;
    for(register int i=1,k=0;i<n;++i)
    {
        while(k&&a[i]!=a[k])
            k=kmp[k];
        kmp[i+1]=a[i]==a[k]?++k:0;
    }
    printf("%d",n-kmp[n]);
    return 0;
}