(UVA)1584

来源:互联网 发布:安知玉如意txt网盘 编辑:程序博客网 时间:2024/06/05 09:13


题意:求长度为n的环状串字典序的最小表示法(顺时针)。

分析:遍历求使得字典序最小的起始点的位置就可以。

我的代码:

#include <bits/stdc++.h>using namespace std;int ord(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 s[(p+i)%len]<s[(q+i)%len];    return 0;}int main(){    int t,i; char s[105];    for(scanf("%d",&t);t;t--)    {        scanf("%s",s);        int len=strlen(s),ans=0;        for(i=1;i<len;i++)            if(ord(s,i,ans)) ans=i;        for(i=0;i<len;i++)            printf("%c",s[(ans+i)%len]); printf("\n");    }    return 0;}
作者示范代码:

// UVa1584(LA3225) Circular Sequence// Rujia Liu#include<stdio.h>#include<string.h>#define maxn 105// 环状串s的表示法p是否比表示法q的字典序小int less(const char* s, int p, int q) {  int n = strlen(s);  for(int i = 0; i < n; i++)    if(s[(p+i)%n] != s[(q+i)%n])      return s[(p+i)%n] < s[(q+i)%n];  return 0; // 相等}int main() {  int T;  char s[maxn];  scanf("%d", &T);  while(T--) {    scanf("%s", s);    int ans = 0;    int n = strlen(s);    for(int i = 1; i < n; i++)      if(less(s, i, ans)) ans = i;    for(int i = 0; i < n; i++)      putchar(s[(i+ans)%n]);    putchar('\n');  }  return 0;}



0 0
原创粉丝点击