HDU 4162 最小表示法
Posted キリト
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4162 最小表示法相关的知识,希望对你有一定的参考价值。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4162
题意:给定一个只有0-7数字组成的串。现在要由原串构造出一个新串,新串的构造方法:相邻2个位置的数字的差值。若为负数则要加上8,问新构造出来的串的一个字典序最小同构串是什么?
思路:就按照题意构造出新串后,然后就是最小表示法了。
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> using namespace std; const int MAXN = 300000 + 5; typedef long long int LL; #define INF 0x3f3f3f3f int MinRepresentation(int *s,int l){ int i = 0, j = 1, k = 0; while (i < l&&j < l&&k < l){ int li, lj; li = (i + k) >= l ? i + k - l : i + k; lj = (j + k) >= l ? j + k - l : j + k; if (s[li] == s[lj]){ k++; } else{ if (s[li]>s[lj]){ i = i + k + 1; } else{ j = j + k + 1; } if (i == j){ j++; } k = 0; } } return i < j ? i : j; } int str[MAXN]; char s[MAXN]; int main() { while (~scanf("%s", s)){ int len = strlen(s); for (int i = 0; i < len; i++){ //构造新串 if (i == len - 1){ str[i] = (((s[0] - ‘0‘) + 8 - (s[i] - ‘0‘)) % 8); } else{ str[i] = (((s[i+1] - ‘0‘) + 8 - (s[i] - ‘0‘)) % 8); } } int start = MinRepresentation(str,len); for (int i = 0; i < len; i++){ printf("%d", str[(start + i) % len]); } printf("\n"); } return 0; }
以上是关于HDU 4162 最小表示法的主要内容,如果未能解决你的问题,请参考以下文章