/* 题意:输入一个字符串,首先进行转换,对应位置变为该位置逆时针到下一个位置需要的变化次数,如果是最后一个则下一个位置为第一个。 s[i] = s[i + 1] - s[i];如果s[i]为负,则加上8 最小表示法 */ #include <iostream> using namespace std; const int nMax = 300010; char s[nMax]; int ans[nMax]; void transform(int len) { for(int i = 0; i < len - 1; ++ i) { ans[i] = s[i + 1] - s[i]; if(ans[i] < 0) ans[i] += 8; } ans[len - 1] = s[0] - s[len - 1]; if(ans[len - 1] < 0) ans[len - 1] += 8; } int minPos(int len) { int i, j, k; for(i = 0, j = 1, k = 0; i < len && j < len && k < len;) { int t = ans[(i + k) % len] - ans[(j + k) % len]; if(t == 0) k ++; else { if(t > 0) i += k + 1; else j += k + 1; k = 0; if(i == j) j ++; } } return min(i, j); } int main() { //freopen("e://data.txt", "r", stdin); while(scanf("%s", s) != EOF) { int len = strlen(s); transform(len); int MinPos = minPos(len); for(int i = MinPos; i < len; ++ i) printf("%d", ans[i]); for(int i = 0; i < MinPos; ++ i) printf("%d", ans[i]); printf("\n"); } return 0; }