Circular Sequence,ACM/ICPC Seoul 2004,UVa 1584

Circular Sequence,ACM/ICPC Seoul 2004,UVa 1584

#include <stdio.h>
#include <string.h>
#define maxn 105 int lss(const char *s,int p,int q)
{
int i, stlen=strlen(s);
for(i=0; i<stlen; i++)
if(s[(p+i)%stlen] != s[(q+i)%stlen])
return s[(p+i)%stlen] < s[(q+i)%stlen];
return 0;
}
int main(void)
{
int n,ans,stlen,i;
char carr[maxn];
scanf("%d",&n);
while(n--)
{
ans=0;
scanf("%s",carr);
stlen=strlen(carr);
for(i=1; i<stlen; i++)
if(lss(carr,i,ans))ans=i;
for(i=0; i<stlen; i++)
putchar(carr[(i+ans)%stlen]);
putchar('\n');
}
return 0;
}

  

求字典序的“最小表示”。

ans表示最小下标,初始值为0,for循环,从1开始循环,依次比较前一个和后一个

第一次 ans=0.i=1,即比较从0开始的字符串与从1开始的字符串那个字典序小,

如果 lss(s,i,ans)则ans=i; //lss()函数返回是否后一个比前一个小,如果小,则将后一个坐标即i赋值给ans,使得ans 一直记录最小的字典序的开始下标。

思路:

找最小字典序,即从开始至最后依次比较,将其字串看成一个环,其下标%其字串长度即可进行循环

ACAB

ACAB 比较 CABA

0123        123[0(4%4)]

在主函数中循环,依次比较,利用自己写的函数(后一个小于前一个),则记录后一个下标。最后记录的是最小字典序的开始下标,然后输出即可

上一篇:潮流设计:15个创意的 3D 字体版式作品欣赏


下一篇:php 设置字符集为utf-8