zoukankan      html  css  js  c++  java
  • [C++]环状序列(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
    */
    

  • 相关阅读:
    161012、JAVA读写文件,如何避免中文乱码
    161011、oracle批量插入数据
    161010、在大型项目中组织CSS
    160930、Javascript的垃圾回收机制与内存管理
    160929、各数据库连接配置与maven依赖安装
    Selenium学习(8) Cookie处理
    Selenium学习(7) 文件上传
    Selenium学习(6) 控制浏览器操作
    Selenium学习(5) 元素等待
    Selenium学习(4) 键盘操作
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/9097323.html
Copyright © 2011-2022 走看看