我用 KMP 判断循环节加 O(n2) 暴力乱搞,一不小心就过了qwq,但是应该很容易就能卡掉:
300000
1 1 1 1 1 ...(299999个) 2
似乎原数据只有全是循环节和随机数据两种情况,所以我乱搞跑的还挺快
我的乱搞:
#include "bits/stdc++.h"
using namespace std;
int n,a[300010],ans;
int nxt[300010];
void kmp(){
int i=0,j=-1;
nxt[0]=-1;
while(i<=n){
if(j==-1||a[i]==a[j]){
i++;
j++;
nxt[i]=j;
}else j=nxt[j];
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
kmp();
int t=1;
if(n%(n-nxt[n])==0){
t=n/(n-nxt[n]);
n-=nxt[n];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[(i+j)%n]>a[(ans+j)%n])break;
if(a[(i+j)%n]<a[(ans+j)%n]){
ans=i;
break;
}
}
}
for(int p=0;p<t;p++){
for(int i=0;i<n;i++){
cout<<a[(i+ans)%n]<<' ';
}
}
return 0;
}