题意:求长度为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;
}