UVa 1584 Circular Sequence --- 水题

Posted tan90丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 1584 Circular Sequence --- 水题相关的知识,希望对你有一定的参考价值。

 

  UVa 1584

  题目大意:给定一个含有n个字母的环状字符串,可从任意位置开始按顺时针读取n个字母,输出其中字典序最小的结果

  解题思路:先利用模运算实现一个判定给定一个环状的串以及两个首字母位置,比较二者字典序大小的函数,

       然后再用一层循环,进行n次比较,保存最小的字典序的串的首字母位置,再利用模运算输出即可

技术分享
/* UVa 1584 Circular Sequence --- 水题 */
#include <cstdio>
#include <cstring>

//字符串s为环状,p q为起始位置 长度都为n, 判断 p 是否小于 q
int less(const char* s, int p, int q){
    int len = strlen(s);
    for (int i = 0; i < len; ++i){
        if (s[(p + i) % len] > s[(q + i) % len]){
            return -1;//p > q
        }
        else if (s[(p + i) % len] < s[(q + i) % len]){
            return 1;// q < q
        }
    }
    return 0; //相等
}

int main()
{
    char s[105];
    int t;
    scanf("%d", &t);
    while (t--){
        scanf("%s", s);
        int ans = 0;
        int len = strlen(s);
        //相当于有n个串进行比较 挑出字典序最小的
        for (int i = 1; i < len; ++i){
            if (less(s, i, ans) == 1){
                ans = i;
            }
        }
        //经过循环的选择 ans已经保存字典序最小的串的第一个字符的位置
        for (int i = 0; i < len; ++i){
            printf("%c", s[(ans + i) % len]);
        }
        printf("\n");


    }//while(t)

    return 0;
}
View Code

 

以上是关于UVa 1584 Circular Sequence --- 水题的主要内容,如果未能解决你的问题,请参考以下文章

Circular Sequence UVa1584

UVa -1584 Circular Sequence 解题报告

UVA1584环状序列 Circular Sequence

UVa 1584 Circular Sequence(环形串最小字典序)

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

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