现在的位置: 首页 > 综合 > 正文

UVA 1584

2018年04月29日 ⁄ 综合 ⁄ 共 2432字 ⁄ 字号 评论关闭

  

Description

Download as PDF

Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequence ``CGAGTCAGCT", that is, the last symbol ``T" in ``CGAGTCAGCT" is connected to the first symbol ``C". We always read a circular sequence in the clockwise
direction.

\epsfbox{p3225.eps}

Since it is not easy to store a circular sequence in a computer as it is, we decided to store it as a linear sequence. However, there can be many linear sequences that are obtained from a circular sequence by cutting any place of the circular sequence. Hence,
we also decided to store the linear sequence that is lexicographically smallest among all linear sequences that can be obtained from a circular sequence.

Your task is to find the lexicographically smallest sequence from a given circular sequence. For the example in the figure, the lexicographically smallest sequence is ``AGCTCGAGTC". If there are two or more linear sequences that are lexicographically smallest,
you are to find any one of them (in fact, they are the same).

Input 

The input consists of T test cases. The number of test casesT is given on the first line of the input file. Each test case takes one line containing a circular sequence that is written
as an arbitrary linear sequence. Since the circular sequences are DNA sequences, only four symbols,A,
C, G and T, are allowed. Each sequence has length at least 2 and at most 100.

Output 

Print exactly one line for each test case. The line is to contain the lexicographically smallest sequence for the test case.

The following shows sample input and output for two test cases.

Sample Input 

2                                     
CGAGTCAGCT                            
CTCC

Sample Output 

AGCTCGAGTC 
CCCT

Input

Output

Sample Input

Sample Output

Hint

Source

Root :: AOAPC II: Beginning Algorithm Contests (Second Edition) (Rujia Liu) :: Chapter 3. Arrays and Strings ::Examples
题读完后,,很容易知道是一道关于字典序的水题,但是切水题速度要快啊,最好做到一次AC,但是我没能做到啊,QAQ!
首先对于字典序,我们做下学习:
   什么是字典序呢?字典序就是字符串在字典中出现的顺序,字典中?对了,就是我们平常所翻的字典啊,a<b<c<d........<z 好了,
字典序是不关心大小写的。
    一般对于两个字符串,从第一个字符串开始比较,当某一个位置的字符不同时,该位置的字符较小的串,字符串较小,
比如说,abc小于bcd。如果其中一个字符串已经没有更多的字符串了,但另外一个字符串还没结束,则那个较短的字符串的字典序
较小,这种情况指的是前面字符都相同的情况下,比较长度就可以了。
比如说,hi比history小,
此外,字典序的概念还可以推广到任意的序列,比如说,1 2 4  7 比1 2 5 小。
好了,讲完了字典序的相关概念,那么这道题来说,一点难度就没有了。相当于我们在找从i个位置开始的最小字符串,然后不断的比较
不断的更新i就可以了,直到我们找到那个最小的字典序并把它输出就可以了。
# include<cstdio>
# include<iostream>
# include<cstring>

using namespace std;

# define MAX 100
//char s[MAX+10];

//环状串s的表示法p是否比q的字典序小
int less1( const char * s,int p,int q )
{
    int n = strlen(s);
    for ( int 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(void)
{
    char s[MAX+10];
    int t;
    scanf("%d",&t);
    while ( t-- )
    {
        int ans = 0;
        scanf("%s",s);
        int n = strlen(s);
        for ( int i = 1;i < n;i++ )
            {
                if ( less1( s,i,ans ) )
                      ans = i;
            }
        for ( int i = 0;i < n;i++ )
        {
            printf("%c",s[(i+ans)%n]);
        }
        printf("\n");
    }


    return 0;
}


【上篇】
【下篇】

抱歉!评论已关闭.