UVa1584

Circular Sequence

Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Submit Status Practice UVA 1584 uDebug

Description

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 Output 

AGCTCGAGTC

CCCT

题意:

有一个环状的字符串序列,仅包含四种字符----‘A’、‘T’、‘G’、‘C’。顺时针读取整个序列,需要你在这个环状序列中找到一个起点字符,从这个字符开始顺时针依次读取完整个字符串,使得得到的字符串的字典序最小。

输入:

情况数T,之后T行每行一个字符串表示任意起点字符开始顺时针读取的环形字符串,长度不小于2不大于100。

输出:

每种情况输出符合字典序最小的字符串解。

分析:

由于该题的字符串长度不大,所以我们可以通过列举字符串可能出现的所有情况找出字符串最小的解。列举的时候就是简单的模拟。其中使用两个函数带来方便:strcpy(s1,s2)将字符串s2复制到s1;strcmp(s1,s2)比较两字符串的字典序,小于0表示s1<s2,等于0表示s1=s2,大于0表示s1>s2。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 // A,C,G,T
 6 const int MAX_N = 100;
 7 char str[MAX_N + 10],mstr[MAX_N + 10];
 8 int main(){
 9     int T; cin >> T;
10     while(T--){
11         scanf("%s",str);
12         int len = strlen(str);
13         strcpy(mstr,str);
14         // 遍历比较
15         for(int i = 0 ; i < len ; i++){
16             char lastc = str[len - 1];
17             for(int j = len - 1 ; j >= 1 ; j--)
18                 str[j] = str[j - 1];
19             str[0] = lastc;
20             if(strcmp(str,mstr) < 0)
21                 strcpy(mstr,str);
22         }
23         printf("%s\n",mstr);
24     }
25     return 0;
26 }

时间: 2024-10-04 18:05:57

UVa1584的相关文章

UVA1584 UVALive3225 Circular Sequence

Regionals 2004 >> Asia - Seoul 问题链接:UVA1584 UVALive3225 Circular Sequence.基础训练级的题,用C语言编写. 这个问题是寻找循环串中的最小者. 不移动字符串是关键,不然就会浪费时间. 程序中,封装了两个功能函数cirstrcmp()和cirstrprintf(),使得主程序的逻辑大为简化.这两个函数是通用性的函数,完全封装,与全局变量没有关系. AC通过的C语言程序如下: /* UVA1584 UVALive3225 Cir

环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)

Question 例题3-5 环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584) 长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这些排列中字典顺序最小的称"最小表示". 如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC. 提示:对于两个字符串,从第一的字符开始比较,当某一个位置的字符不同时,该位置字符较小的串,字典序小,如果一个字符串没有更多的字符,但是另一个字符串还没结束,则较短

UVa1584 Circular Sequence

#include <stdio.h>#include <string.h> int less(char* str, size_t len, size_t p, size_t q){    size_t i, a, b;    for (i = 0; i < len; ++i)    {        a = (p+i) % len;        b = (q+i) % len;        if (str[a] < str[b])            return

【紫书】例题3-6 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)

[题目描述] 长度为n的环状串有n种表示法,分别为某个位置开始顺时针得到.例如,图中的环状串有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等.在这些表示法中,字典序最小的称为"最小表示". 输入一个长度为n(n<=100)的环状DNA串(只包含A.C.G.T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示.例如,CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC. 输入: 在输入文件的第一行 为序列数量.

环状序列(UVa1584)

题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4459 C++11代码如下: 1 #include<iostream> 2 #include<string.h> 3 #define maxn 103 4 using namespace std; 5 char s[maxn]; 6 //C++中注意避

Circular Sequence UVa1584

描述: 长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这些排列中字典顺序最小的称"最小表示". 如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #define maxn 110 4 5 6 char a[maxn]; //the array entered by users. 7 char b[maxn]; /

环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)

长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到.例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等. 在这些表示法中,字典序最小的称 为"最小表示". 输入一个长度为n(n≤100)的环状DNA串(只包含A.C.G.T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示. 例如,CTCC的最小表示是 CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC. [分析] 本题出现了一个新概念:字典序.所谓

UVA 1584 环状序列

题意: 给定一个环状字符串,输出字典序最小的线装字符串. 分析: 我一开始是将原字符串*2去模拟环,然后分别截取以字符串不同字母为首的子串,然后用sort去排序输出最小的串,复杂度为O(n^2 + nlogn)吧. 然后看了紫书的题解,用了一个函数去枚举比较每一个字母为开头的子串和预估答案的子串的字符串字典序大小,枚举串的某一个字母的使整个串字符串小于另一个串(他们长度都是一样的,只要其中一个小,那么整个就会小,因为字典序是取决前面的字母的)就立刻更新ans,然后他用的是下标mod长度,最坏复杂

2019年2月做题记录

UVA10082 (字符串常量水题) UVA272 (字符串替换水题) UVA401 (回文串镜像串水题) UVA340 (模拟题) UVA1583 (打表水题) UVA1584 (暴力) UVA1585 (模拟) UVA1586 (数学) UVA1225 (打表水题) UVA455 (KMP算法) UVA232 (模拟+思维) UVA202 (除法高精度水题) UVA1587 (思维) UVA10340 (模拟,定序求交集) 原文地址:https://www.cnblogs.com/Aya-U