【白书之路】1584 - 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.

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, 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 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;
}






你可能感兴趣的:(sequence,Circular,1584,白书之路,最小字典序)