BZOJ-1355 [Baltic2009]Radio Transmission(KMP求最小迴圈節)
阿新 • • 發佈:2020-11-14
題目描述
給一個長為 \(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; } */