Circular Sequence,ACM/ICPC Seoul 2004,UVa 1584

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('
');
    }
    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)]

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