http://acm.hdu.edu.cn/showproblem.php?pid=4162
可参看百度文库 周源(最小表示法)http://wenku.baidu.com/view/0e1a6013a216147917112820.html
题目大意:找出字典序中最小的排列 若通过枚举,绝对超时,参看最小表示法模板
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char str[300010];
int Min(char str[],int len)
{
int i=0,j=1,k=0;
while(i<len&&j<len&&k<len)
{
if(str[i+k]==str[j+k])
k++;
else
{
if(str[i+k]>str[j+k])
i+=k+1;
else
j+=k+1;
if(i==j)
j++;
k=0;
}
}
return i<j?i:j;
}
int main()
{
int i,len,t,k;
while(scanf("%s",str)!=EOF)
{
len=strlen(str);
t=str[0];
for(i=0;i<len-1;i++)
{
str[i]=(str[i+1]-str[i]+8)%8+'0';
}
str[i]=(t-str[i]+8)%8+'0';
k=Min(str,len);
for(i=k;i<len;i++)
printf("%c",str[i]);
for(i=0;i<k;i++)
printf("%c",str[i]);
printf("\n");
}
return 0;
}