一些DNA序列以圆形存在,如下图显示了循环序列“CGAGTCAGCT”,即“CGAGTCAGCT”连接到第一个符号“C”。我们总是按顺时针方向读一个循环序列。因为在计算机中存储循环序列并不容易
事实上,我们决定把它存储为一个线性序列。但是,可以得到许多线性序列通过切割循环序列。因此,我们还决定存储在所有线性序列中词汇最小的序列从循环序列中获得的序列。你的任务是找出词典中最小的序列从给定的循环序列。对于图中的示例,词汇上最小的序列是“AGCTCGAGTC”。如果有两个或多个线性序列在词汇上是最小的,你要找到它们中的任何一个(事实上,它们是相同的)。
输入
输入由T个测试用例组成。测试用例的数量T在输入的第一行给出文件。每个测试用例取一行,其中包含一个循环序列,该循环序列以任意线性形式写入顺序。因为循环序列是DNA序列,所以只有个符号“A”、“C”、“G”和“T”允许。每个序列的长度至少为2且最多为100。
输出
为每个测试用例打印一行。这一行包含字典上最小的序列对于测试用例。
#include<stdio.h>
#include<string.h>
#define max 101
int less(char*s,int p,int q)
{
int i;
int n=strlen(s);
for(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()
{
char s[max];
int T,i;
scanf("%d",&T);
while(T--)
{
int a=0;
scanf("%s",s);
int n=strlen(s);
for(i=1;i<n;i++)
{
if(less(s,i,a))
a=i;
}
for(i=0;i<n;i++)
{
putchar(s[(i+a)%n]);
}
putchar('\n');
}
return 0;
}