HDOJ 4162 Shape Number(最小表示法 )

来源:互联网 发布:mac下jenkins安装 编辑:程序博客网 时间:2024/06/05 05:30
/*题意:输入一个字符串,首先进行转换,对应位置变为该位置逆时针到下一个位置需要的变化次数,如果是最后一个则下一个位置为第一个。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;elsej += 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;}

原创粉丝点击