uva 1584 - Circular Sequence(环状序列)

长度为n的环状串有n种表示法,分别为从某
个位置开始顺时针得到。例如,图3-4的环状串
有10种表示:
CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称
为”最小表示”。
输入一个长度为n(n≤100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表
示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是
CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。
Sample Input
2
CGAGTCAGCT
CTCC
Sample Output
AGCTCGAGTC
CCCT

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=829&page=show_problem&problem=4459

#include<iostream>
#include<string>
#include<cstdio>
#include<string.h>
using namespace std;
int const N = 100;
//比较从be1,和从be2开始的字串哪一个更小
int com(char *s,int be1,int be2)
{
    int sl=strlen(s);
    for(int i=0;i<sl;i++)
    {
        //cout<<endl<<(be1+i)%N<<endl;
    //cout<<s[(be1+i)%N]<<"_"<<s[(be2+i)%N]<<endl;
        if(s[(be1+i)%sl]>s[(be2+i)%sl])
            return be2;
        if(s[(be1+i)%sl]<s[(be2+i)%sl])
            return be1;
    }
    return be1;
}
    char s[N+5];
int main()
{
//    char acgt[4]="ACGT";
    int T=1;
    cin>>T;
    while(T--)
    {
        scanf("%s",s);
        int j=0;
        int be1=0,be2;

        for(int i=0;i<strlen(s);i++)//找最小的首字符给be1
        {
            if(s[i]<s[be1])
            {
                be1=i;
            }
        }
        //cout<<be1<<endl;
        for(int i=0;i<strlen(s);i++)//在最小的首字符中 找最小的字串
        {
            if(s[i]==s[be1])
            {
                if(com(s,be1,i)==i)
                   be1=i;
            }
        }
        for(int i=0;i<strlen(s);i++)
            cout<<s[(be1+i)%strlen(s)];
        cout<<endl;
    }
    return 0;
}
ACat2017/12/9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值