环状序列(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++中注意避免使用less作为自定义函数,因为会和标准库中的less函数重名,或者使用不同的空间域来界定
 7 bool less_seq(const char* s, int p, int q) {  //用来比较以p和q作为起始位置表示的哪种字典序小
 8     int n = strlen(s);
 9     for (int i = 0; i < n; i++)
10         if (s[(p + i) % n] != s[(q + i) % n])  //使用 %n 来实现序列的循环
11             return s[(p + i) % n] < s[(q + i) % n];
12     return false;
13 }
14
15 int main() {
16     int n, T;
17     cin >> T;
18     while (T--) {
19         int min = 0;   //定义字典序最小的起始位置为min
20         cin >> s;
21         n = strlen(s);
22         for (int i = 0; i < n; i++)
23             if (less_seq(s, i, min)) min = i;  //更新min
24         for (int i = 0; i < n; i++)
25             cout << s[(min + i) % n];  //循环打印
26         cout << endl;
27     }
28     return 0;
29 }

原文地址:https://www.cnblogs.com/pgzhang/p/9225608.html

时间: 2024-11-13 06:41:11

环状序列(UVa1584)的相关文章

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

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

【紫书】例题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. 输入: 在输入文件的第一行 为序列数量.

环状序列(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长度,最坏复杂

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

P1121 环状最大两段子段和

P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N(N\le 2\times 10^{5})(N≤2×10?5??),表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的. 输出格式: 输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少. 输入输出

环状最大两段子段和

题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的. 输出格式: 输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 9题解:动态规划最大两

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 ``CGAGT

洛谷P1121 环状最大两段子段和

题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的. 输出格式: 输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 9 说明 [样例说明]