【洛谷 P1368】 最小表示法 题解
题目
样例
input
10
10 9 8 7 6 5 4 3 2 1
output
1 10 9 8 7 6 5 4 3 2 1
解题思路
预处理
将整一个串复制一遍放在后面
i和j是寻找最小表示的起始
k是已经有多少个一样的
然后
i
i
i从1开始,
j
j
j从2开始
要错开找
循环判断如果第
i
i
i+
k
k
k个和第
j
j
j+
k
k
k个相同
那
k
k
k+1
如果
k
k
k>=n了
退出大循环
如果第
i
i
i+
k
k
k个大
那就
i
i
i+
k
k
k+1
如果恰好
i
i
i==
j
j
j
那
i
i
i再+1
否则
j
j
j+
k
k
k+1
如果
i
i
i==
j
j
j
j
j
j再+1
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[700010],w;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
int i=1,j=2,k=0;
while (i<=n&&j<=n)
{
k=0;
while(a[i+k]==a[j+k]&&k<=n)
k++;
if(k>=n)
break;
if (a[i+k]<a[j+k])
{
j+=k+1;
if(i==j)
i++;
}
else
{
i+=k+1;
if(i==j)
j++;
}
}
w=min(i,j);
for (int i=w;i<=w+n-1;i++)
printf("%d ",a[i]);
return 0;
}