WA了很多次,最后发现是因为把s,min数组定义在了for循环内,好吧,终于AC了。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;
char s[maxn + 10], min[maxn + 10];
int main()
{
//freopen("New Text Document.txt","r",stdin);
//freopen("Output.txt","w",stdout);
int t;
scanf("%d", &t);
for(int i = 1; i <= t; i++)
{
scanf("%s", s);
int len = strlen(s);
min[len] = '\0';
for(int j = 0; j < len; j++)
{
s[j+len] = s[j];
min[j] = s[j];//min±£´æ×ÖµäÐò×îСµÄ
}
for(int j = 1; j < len; j++)
for(int k = j; k < j+len; k++)
{
if(s[k] < min[k-j])
{
for(int m = k; m < j+len; m++)
min[m-j] = s[m];
break;
}
else if(s[k] > min[k-j]) break;
else continue;
}
printf("%s\n", min);
}
//getchar();getchar();
return 0;
}
我在处理环状时,处理方式是再复制了一份,放到这个数组之后,下面这个是刘汝佳标程,里面是用了取mod操作来处理环状,感觉的确很巧妙。
// 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;
}