Skip to content

最小表示法 ​

cpp
int min_show(vector<int> a){
    int i=0,j=1,k=0,n=a.size();
    for(int i=0;i<n;i++)a.push_back(a[i]);
    n=a.size();
    while(i<n&&j<n&&k<n){
        if(a[(i+k)%n]==a[(j+k)%n])k++;
        else{
            a[(i+k)%n]>a[(j+k)%n]?i+=k+1:j+=k+1;
            if(i==j)j++;
            k=0;
        }
    }
    return min(i,j);
}

duval版最小表示法 ​

cpp
int min_show(vector<int> a){
    int n=a.size(),i=0,j,k;
    for(int i=0;i<n;i++)a.push_back(a[i]);
    n=a.size();
    int ans=0;
    while(i<n/2){
        ans=i;
        j=i+1,k=i;
        while(j<n&&a[k]<=a[j]){
            if(a[k]<a[j])k=i;
            else k++;
            j++;
        }
        while(i<=k)i+=j-k;
    }
    return ans;
}