看了很久也没有看懂 等以后有机会了吧
洛谷P1368
#include<bits/stdc++.h>
using namespace std;
int n,d[1000000];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&d[i]);
int i=0,j=1,k=0;
while(i<n&&j<n&&k<n){
if( d[(i+k)%n] == d[ (j+k)%n ] )k++;//如果前后两个字符相同,那么k++;
else {
if(d[(i+k)%n]>d[(j+k)%n]) i=i+k+1;//表明前段比后段大 那么前段肯定不能作为前缀。
else j+=k+1; //后段较大 那么后段就往后 推一下
if(i==j)i++;//如果前面等于后面 任何时候都要满足 i!=j
k=0;
}
}
if(i>j)i=j;
for(int x=0;x<n;x++)printf("%d ",d[(x+i)%n]);
return 0;
}