传送门:bzoj2882
题解
O(n)最小表示法
代码
#include<bits/stdc++.h>
using namespace std;
const int N=6e5+100;
int n,a[N],st;
int main(){
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;++i) {scanf("%d",&a[i]);a[i+n]=a[i];}
for(i=1,j=2,k=0;i<=n && j<=n && k<n;){
if(a[i+k]==a[j+k]) k++;
else{
if(a[i+k]>a[j+k]) i+=k+1;
else j+=k+1;
k=0;if(i==j) j++;//
}
}
st=min(i,j);
for(i=0;i<n;++i) printf("%d ",a[st+i]);
return 0;
}