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

Posted 千千寰宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)相关的知识,希望对你有一定的参考价值。

Question

例题3-5 环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)

  长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这些排列中字典顺序最小的称“最小表示”。 如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。 提示:对于两个字符串,从第一的字符开始比较,当某一个位置的字符不同时,该位置字符较小的串,字典序小,如果一个字符串没有更多的字符,但是另一个字符串还没结束,则较短的字符串的字典序较小。

Think

【概念】

  字典序:环状字典序/全排列字典序(含:环状字典序)

Code

/*
	例题3-5 环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)
*/
#include<iostream>
#include<string.h>
using namespace std;

const int maxn = 105;

//比较环状串s的两序列q与p的字典序大小,若q<p,返回值:1;反之:0
static int Less(char *s, int len, int q, int p){
	int cmp;
	for(int i=0;i<len;i++){
		cmp = s[(q+i)%len] - s[(p+i)%len];
		if(cmp > 0){ //q>p
			return -1;
		} else if(cmp < 0){ //q<p
			return 1;
		}
	}
	return 0;//q == p
}

int main(){
	int n;
	int len,ans;//len:字符串长度;	ans:偏移量
	char str[maxn];
	scanf("%d", &n);
	while(n--){
		scanf("%s", &str);
		len = strlen(str);
		for(int i=0;i<len;i++){
			if(Less(str, len, i, ans) > 0) //如果i序列小,则换i
				ans = i;
		}
//		cout<<"Hi"<<endl;//test
		for(int i=0;i<len;i++){
			//printf("%s", str[(ans+i)%len]);//为何此处会卡住?
            putchar(str[(ans+i)%len]);
		}
	}
	return 0;
}
/*
1
CCTC

CCCT
*/

 

以上是关于环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)的主要内容,如果未能解决你的问题,请参考以下文章

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

UVa 1584 Circular Sequence --- 水题

环状序列

P52 环状序列

环状序列(UVa1584)

UVA 1584 环状序列