最小表示法裸题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
char ch=getchar();int f=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9')
{f=(f<<1)+(f<<3)+ch-'0';
ch=getchar();}
return f;
}
int a[300005],n,m;
int main()
{
n=read();
for(int i=0;i<n;i++)
a[i]=read();
int i=0,j=1,k=0,x,y;
while(i<n&&j<n&&k<n)
{
if(a[(i+k)%n]==a[(j+k)%n]) k++;
else if(a[(i+k)%n]>a[(j+k)%n]) i+=k+1,k=0;
else j+=k+1,k=0;
if(i==j)
i++;
}
x=min(i,j);
for(int ii=0;ii<n-1;ii++)
printf("%d ",a[(ii+x)%n]);
printf("%d",a[(x+n-1)%n]);
}