最小表示法:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 char a[3004000];
6 char b[3004000];
7 int l;
8 int MinimumRepresentation()
9 {
10 int i = 0, j = 1, k = 0, t;
11 while(i < l && j < l && k < l) {
12 t = b[(i + k) >= l ? i + k - l : i + k] - b[(j + k) >= l ? j + k - l : j + k];
13 if(!t) k++;
14 else{
15 if(t > 0) i = i + k + 1;
16 else j = j + k + 1;
17 if(i == j) ++ j;
18 k = 0;
19 }
20 }
21 return (i < j ? i : j);
22 }
23 int main()
24 {
25 while(~scanf("%s",a))
26 {
27 int n=strlen(a);
28 l=n;
29 a[n]=a[0];
30 for(int i=0;i<n;i++)
31 {
32 if(a[i]<=a[i+1])
33 b[i]=a[i+1]-a[i];
34 else
35 b[i]=8-(a[i]-a[i+1]);
36 }
37 int tmp=MinimumRepresentation();
38 for(int z=0;z<n;z++)
39 {
40 printf("%d",b[(z+tmp)%n]);
41 }
42 printf("\n");
43 }
44 }