题目描述
解题思路
这道题可以用 最小表示法 。。
(本蒟蒻太菜了,比赛时都没听过这个算法 TOT,自闭中。。。)
我们预处理每个圆盘中关键点之间的差,然后做一遍最小表示法。统计答案时枚举每个圆盘的最小表示法,若相同,就ans++。
(打了一个晚上的最小表示法,我没了。。。)
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
int n,k,i,j,a[40000000];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
i=1,j=2;
while(i<=n&&j<=n)
{
for(k=0;k<=n;k++)
if(a[i+k]!=a[j+k])
break;
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++;
}
}
for(k=min(i,j);k<min(i,j)+n;k++)
printf("%d ",a[k]);
}