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,j=i+1; else j+=k+1; if(i==j) j++; k=0; } } return i; } 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; }