1. 程式人生 > >Circular Sequence 最小字典序

Circular Sequence 最小字典序

1584 - Circular Sequence

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 cases T 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

CG 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 Input

AGCTCGAGTC 
CCCT

求一個串的所有迴圈串中字典序最小的那個串。

先來說一下什麼是最小字典序,假設有兩個串ABCD,ACBD,那麼第一個串的字典序要比第二個小,比較的方法就是從左往右以此比較字元,直到出現字元不相等,字元大的串其字典序就大。

就本題而言,我們不需要找出一個串的所有組合,只需要找到其迴圈串,即將這些字元放到一個圓上,從任何一個字元出發都可以找到一個字元序列,我們只要從這些序列中找到字典序最小的即可,可以用strcmp()函式。

#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX 110
using namespace std;

char seq[MAX];
char seq_temp[MAX];
char seq_min[MAX];
int len;

void get_str()
{
    int i,j;
    memcpy(seq_min,seq,sizeof(seq));
    for(i=0;i<len;i++)
    {
        for(j=0;j<len;j++)//列舉所有的迴圈串
        {
            seq_temp[j]=seq[(j+i)%len];
        }
        //printf("%s\n",seq_temp);
        if(strcmp(seq_min,seq_temp)>0)//比較字典序
            memcpy(seq_min,seq_temp,sizeof(seq));
    }
    printf("%s\n",seq_min);
}


int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(seq_min,'\0',sizeof(seq_min));//初始化
        memset(seq_temp,'\0',sizeof(seq_temp));
        scanf("%s",seq);
        len=strlen(seq);
        get_str();
    }
    return 0;
}