题目
题目
题目大意:
给定一个序列,求其最小表示发法。
题解
裸的模板题,\(O(n)\)线性时间即可解。
#include <iostream>
using namespace std;
const int N=6E5+10;
int n,a[N],ans;
int main() {
cin>>n;
for(int i=0;i<n;i++) {
cin>>a[i];
a[i+n]=a[i];
}
n--;
int i=1,j=2,k;
while(i<=n and j<=n) {
for(k=0;k<n and a[i+k]==a[j+k];k++);
if(k==n)
break;
if(a[i+k]>a[j+k]) {
i=i+k+1;
if(i==j)
i++;
}
else {
j=j+k+1;
if(i==j)
j++;
}
}
ans=min(i,j); //求出最小表示的初始位置
for(int i=ans;i<=ans+n;i++)
cout<<a[i]<<' ';
return 0;
}