1.最小表示法裸题。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 8 const int maxn=300005; 9 10 int n,T; 11 int a[2*maxn]; 12 13 void print(int p,int q){ 14 int ans=min(p,q); 15 for(int i=ans;i<ans+n;i++) 16 printf("%d%c",a[i],i+1==ans+n?' ':' '); 17 } 18 19 void solve(){ 20 int i=0,j=1,k; 21 while(i<n&&j<n){ 22 for(k=0;k<n;k++) 23 if(a[i+k]!=a[j+k]) break; 24 if(k==n) break; 25 if(a[i+k]>a[j+k]) i+=k+1; 26 else if(a[i+k]<a[j+k]) j+=k+1; 27 if(i==j) j++; 28 } 29 print(i,j); 30 //cout<<min(i,j)<<endl; 31 } 32 33 int main() 34 { cin>>T; 35 while(T--){ 36 scanf("%d",&n); 37 for(int i=0;i<n;i++){ 38 int tem;scanf("%d",&tem); 39 a[i]=tem; 40 a[i+n]=tem; 41 } 42 solve(); 43 } 44 return 0; 45 }