题意:长度为n的环状串,求字典序最小的表示。
刘汝佳《算法竞赛入门经典2》p52
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctype.h>
using namespace std;
char n[110];
int len;
int les(int x, int y)
{
for(int i=0; i<len; i++)
{
if(n[(x+i)%len] != n[(y+i)%len])
return n[(x+i)%len] < n[(y+i)%len];
}
return 0; //相等的情况
}
int main()
{
while(scanf("%s",n) != EOF)
{
len = strlen(n);
int ans = 0;
for(int i=1; i<len; i++)
{
if(les(i,ans))
ans = i;
}
for(int i=0; i<len; i++)
printf("%c",n[(ans+i)%len]);
cout << endl;
}
return 0;
}