题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4459
题目大意:长度为n的环状串有n中表示方法,分别从某个位置顺时针得到,输出该环串的“最小表示”(按字典序列)。
#include<stdio.h>
#include<string.h>
#define maxn 105
//环串s的表示法p是否比表示法q的字段序列小
int less(const char* s,int p,int q){
int n = strlen(s);
for(int i=0;i<n;i++)
if(s[(p+i)%n] != s[(q+i)%n])
return s[(p+i)%n]<s[(q+i)%n];
return 0;
}
int main()
{
int T;
char s[maxn];
scanf("%d",&T);
while(T--){
scanf("%s",s);
int ans = 0;
int n = strlen(s);
for(int i=1;i<n;i++)
if(less(s,i,ans)) ans = i;
for(int i=0;i<n;i++)
putchar(s[(i+ans)%n]);
putchar('\n');
}
return 0;
}