题目: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 = + ;
typedef long long int LL;
#define INF 0x3f3f3f3f
int MinRepresentation(int *s,int l){
int i = , j = , k = ;
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 + ;
}
else{
j = j + k + ;
}
if (i == j){
j++;
}
k = ;
}
}
return i < j ? i : j;
}
int str[MAXN];
char s[MAXN];
int main()
{
while (~scanf("%s", s)){
int len = strlen(s);
for (int i = ; i < len; i++){ //构造新串
if (i == len - ){
str[i] = (((s[] - '') + - (s[i] - '')) % );
}
else{
str[i] = (((s[i+] - '') + - (s[i] - '')) % );
}
}
int start = MinRepresentation(str,len);
for (int i = ; i < len; i++){
printf("%d", str[(start + i) % len]);
}
printf("\n");
}
return ;
}