题解 P1368 【工艺 /【模板】最小表示法】
1.问题描述
给出一个长度为
2.算法流程
1.定义两个指针
2.比较第
若
若
若
3.若
4.若
3.证明
1.当
2.当
在
3.又
4.复杂度
时间复杂度
5.代码
P1368 工艺 /【模板】最小表示法
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,a[N];
int sol(int n,int a[N])
{
if(n==1) return 0;
int i=0,j=1,k=0;
while(i<n&&j<n&&k<n)
{
if(i==j) i++;
else 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;
}
return min(i,j);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int ans=sol(n,a);
for(int i=0;i<n;i++)
printf(i==n-1?"%d\n":"%d ",a[(i+ans)%n]);
}