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;
}

本文探讨了一个编程问题,即WA多次后发现数组定义位置错误导致无法通过AC。通过实例分析,展示了如何正确地在for循环外定义数组,并提供了解决方案。文章还引用了刘汝佳的标程作为比较,展示了使用取模操作处理环状串的巧妙方法。
4143

被折叠的 条评论
为什么被折叠?



