【紫书】例题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.

输入:

在输入文件的第一行 为序列数量。每一个测试用例都需要一行包含一个循环序列,这个序列被写成一个任意的线性序列。由于循环序列是DNA串,只有四个符号:A,C,G,T。每一序列的长度为n(2<=n<=100)。

输出:

每行为串的字典序最小的序列。下面的样例为2个串的序列。

【样例输入】


CGAGTCAGCT 
CTCC

【样例输出】

AGCTCGAGTC 
CCCT

【代码实现】

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 #define MAX (int)1e2 + 10
 5
 6 int Isless( const char s[], int i, int start)
 7 {
 8     int len = strlen(s);
 9     printf ("%d\n", len);
10     for ( int j = 0; j < len; j ++)
11         if ( s[(i+j)%len] != s[(start+j)%len])
12             return s[(i+j)%len] < s[(start+j)%len];
13     return 0;
14 }
15
16 int main()
17 {
18     char s[MAX];
19     while ( scanf ("%s", s) == 1 ) {
20         int start = 0;
21         int n = strlen(s);
22         for ( int i = 1; i < n; i++ ) {
23             if ( Isless(s, i, start) ) start = i;
24         }
25         for ( int i = 0; i < n; i++ ) {
26             printf ("%c", s[(start + i) % n]);
27         }
28         printf ("\n");
29     }
30
31     return 0;
32 }

【总结】

自己想的有点复杂,没能写出来。。直接看的书,但书上题目描述不像上面那样详细,所以对具体输入的实现有些差别。但核心是一样的:下标0~n-1,找到最小字典序的起始位置。只要当前下标的字典序小于之前的,就将它用 start 记录下来,即不断更新 start 。有点类似于一组数中找最小值,只是比较方法单写了一个自定义函数罢了。

其中自定义函数形参表中的 const char* s 是个新的启发,如果写成 char s[] 则会有两点问题:

1. 定义不够准确,自定义函数中并不会对数组s进行修改,所以类型至少应该为 const char ;

2. 如果是形参为数组s[ ],则在函数内无法使用 sizeof 来求出数组长度,而定义为指针则不会有这个麻烦(虽然本题中使用的是 strlen() )。

对于循环数组的下标处理,在循环队列的数组实现时已经学过,但是又忘了。。这回再捡起来:对数组长度取模!

原文地址:https://www.cnblogs.com/lilinilil/p/8450295.html

时间: 2024-10-01 07:08:32

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

环状序列(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. [分析] 本题出现了一个新概念:字典序.所谓

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

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

紫书例题6-3 (UVa 442)

题目地址:https://vjudge.net/problem/UVA-442 题目大意:汗颜,其实我是直接看紫书的中文题意的,大意就是计算两个矩阵乘法次数,设计线性代数知识,可自己百度矩阵乘法. 思路:栈+模拟,左括号开始入栈,右括号开始计算栈顶两个矩阵的乘法次数然后再将新矩阵的n,m入栈即可. AC代码: #include <iostream> #include <string> #include <stack> #include <cstring> u

紫书例题6-4 (UVa 11988)

题目链接:https://vjudge.net/problem/UVA-11988 题目大意:输入一串字符,并按照要求输出,遇到'['字符就将光标移动到开头,遇到']'字符就将光标移动到末尾. 思路: 题目不难懂,很明显的一个模拟就行,重点是如何取存储,这里选择使用链表,链表的具体定义可以去百度看一下,这里不做过多解释,可以简单理解为一个未知长度的数组,它可以借助指针在任意位置插入(删除). 这题具体的操作可以用草稿纸模拟一遍,我是看一位博主的blog明白的,原blog地址:https://bl

紫书例题6-7 树的层次遍历

纯小白也能看懂的代码,一起努力 6.3.2 二叉树的层次遍历 例题6-7 树的层次遍历(Trees on the level, Duke 1993, UVa 122) 输入一棵二叉树,你的任务是按从上到下.从左到右的顺序输出各个结点的值.每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开.每棵树的输入用一对空括号"()"结束(这对括号本身不代表一个结点),如图6-3所示 注意,如果从根到某个叶结点的

【紫书】例题3-5 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

[题目描述] 如果x加上x的各个数字之和得到y,就说x是y的生成元.给出n(1≤n≤100000),求最小生成元.无解输出0.例如,n=216,121,2005时的解分别为198,0,1979. [代码实现] 方法1 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n = 0; 9 while ( scanf ("%d", &a

第10章例题(紫书)

21/21 题目都很基础,有很多题书上讲得比较详细,然后隔得时间有点久,所以具体什么trick都忘了,思路也懒得去回忆,所以将就着放上来了.... 例题10–1 Uva 11582 题意:输入a, b, n让你计算F[a^b]%n;其中这个F[i]是斐波那契数: 题解: 这题是快速幂+找循环节,用什么方法找循环节呢?因为第一个数是0和1,然后当再出现0和1的时候就是出现循环节的时候,然后假如找到了循环节T,然后就有F[n] = F[n % T],预处理找循环节,O(一百万左右),快速幂logn

第11章例题(紫书)

10/15 这几天先专心刷一下图论的基础题目,也蛮多的,慢慢来... 例题11-1 uva 12219 题意:给你一个表达式,然后又一些子树在之前重复出现过,先要你给这些子树出现的顺序编个号1...N,然后如果重复出现就用编号替代,输出替代之后的表达式. 题解:这是一个表达式树的问题,显示建树,如果让我来写的话,很麻烦,搞不好复杂度是O(n^2),因为字符串是一直扫描下去的,所以就利用一个指针作为全局,然后一直扫下去,就忽略一个左括号,建左树,然后忽略逗号,建右树,忽略右括号,然后一直扫下去,就

UVA 1584 - Circular Sequence(环状序列)(字典序)

1584 - Circular Sequence Time limit: 3.000 seconds 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 firs