UVa 1584 Circular Sequence

来源:互联网 发布:FGO黑贞各礼装伤害数据 编辑:程序博客网 时间:2024/05/17 15:39

Problem Description

长度为n的环状串有n种表示法,分别为从某个位置开始顺时针得到。在这些表示法中,字典序最小的称为“最小表示”。输入一个长度为n的**环状**DNA串(只包含A、C、G、T)的一种表示法,你的任务是输出该环状串最小表示。
Sample Input
2
CGAGTCAGCT
CTCC

Sample Output

AGCTCGAGTC
CCCT

代码:

#include<stdio.h>#include<string.h>int cmp(char s[], int a, int b)//a和b下标开始的串比较{    int n, i, x;    n = strlen(s);    for(i = 0; i < n; i++)    {    //对n取余很重要,谁小x就等于谁        if(s[(a + i) % n] > s[(b + i) % n]) {x = b; break;}        else if(s[(a + i) % n] < s[(b + i) % n]) {x = a; break;}        else continue;    }    return x;//返回x给ans}int main(){    int t, n, i, flag, ans;    char a[105];    scanf("%d", &t);    while(t--)    {        scanf("%s", a);        n = strlen(a);        ans = 0;//从ans下标开始的串最小        for(i = 1; i < n; i++)        {            ans = cmp(a, i, ans);//遍历一边找到最小的串开始下标赋值给ans        }        for(i = 0; i < n; i++)        {            printf("%c",a[(ans + i) % n]);//输出最小的串        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击