题目描述:长度为n的环状串有n中表示方法,分别为从某个位置开始顺时针得到,有些表示法中,字典序最小的称为“最小表示法”。求一个字符串的最小表示。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int LESS(char *s,int p,int q)
{
int n;
n=strlen(s);
int i;
for(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 n,i,len;
char str[105];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",str);
int ans=0,j;
len=strlen(str);
for(j=1;j<len;j++)
if(LESS(str,j,ans))ans=j;
for(j=0;j<len;j++)
putchar(str[(j+ans)%len]);
putchar('\n');
}
return 0;
}
在有循环遍历的题目中注意%n的使用,类比于猴子选大王。