思路
也是最小表示法,这不过之前要进行差分的预处理
代码
#include <bits/stdc++.h>
using namespace std;
int a[300100];
int getMax(int a[], int n)
{
int i=0, j=1, k=0;
while(i<n&&j<n&&k<n){
if(a[i+k]<a[j+k]){
j+=k+1;
if(i==j)j++;
k=0;
}
else{
if(a[i+k]>a[j+k]){
i+=k+1;
if(i==j)i++;
k=0;
}else{
k++;
}
}
}
return (min(i,j));
}
int main()
{
string s;
while(cin>>s)
{
int len=s.length();
for(int i=0;i<s.length()-1;i++)
{
a[i]=s[i+1]-s[i];
if(a[i]<0) a[i]+=8;
}
a[len-1]=(s[0]-'0')-(s[len-1]-'0');
if(a[len-1]<0) a[len-1]+=8;
int pos=getMax(a,len);
for(int i=0;i<len;i++)
printf("%d",a[(pos+i)%len] );
printf("\n");
}
}