解析:
最小表示法实现方法:
1.利用两个指针,i指针指向s[0],j指针指向s[1] 任何时刻i和j都不能相等
2.匹配长度k=0开始 判断s[i+k]是否等于s[j+k] 相等k++,直到不同的字符
在匹配过程中 s[i+k]和s[j+k]由三种匹配关系
第一种:s[i+k]>s[j+k] i跳转到i+k+1
第二种:s[i+k]<s[j+k] i跳转到j+k+1
第三种:s[i+k]==s[j+k] 则k++
如果k==n 取起点最小的min(i,j);即可
#include<bits/stdc++.h>
using namespace std;
const int N=6e5+1000;
int a[N],n;
void slove()
{
int i=0,j=1,k;
while(i<n&&j<n)
{
for(k=0;k<n&&a[i+k]==a[j+k];k++)
if(k==n) break;
if(a[i+k]>a[j+k])
{
i+=k+1;
if(i==j) i++;
}
else
{
j+=k+1;
if(i==j) j++;
}
}
k=min(i,j);
for(int i=0;i<n;i++)
{
cout<<a[i+k]<<" ";
}
cout<<endl;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) a[i+n]=a[i];
slove();
}