P4391 [BOI2009] Radio Transmission 無線傳輸

黑屿白發表於2024-05-03

原題連結

題解

KMP演算法的應用。

我們知道KMP演算法中NEXT陣列是當前位置除外的最大前字尾長度。

直接丟擲結論:ans=cnt-Next[n]

證明過程

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int Next[N];
string s;
void NEXT(){
    int cnt=s.size();
    if (cnt==1){
        Next[0]=-1;
        return;
    }
    Next[0]=-1;
    Next[1]=0;
    int i=1,cn=0;
    while (i<cnt){
        if (s[i]==s[cn]) Next[++i]=++cn;
        else if (cn!=0) cn=Next[cn];
        else Next[++i]=cn;
    }
}
int main(){
    int l;
    cin>>l;
    cin>>s;
    int cnt=s.size();
    NEXT();
    cout<<cnt-Next[cnt]<<endl;
    return 0;
}

相關文章