我在stackoverflow中看到过这个问题。我为这个问题实现了O(n)解决方案,它在spoj(http://www.spoj.com/problems/MINMOVE)上被接受,但它在(https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=756)上给出了错误的答案。请看看我的代码。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
char *s=(char *)malloc(sizeof(char)*100011);
int test;
scanf("%d",&test);
while (test--){
int i=0,j=1,k=0,n;
scanf("%d",&n);
scanf("%s",s);
long long let=(n<<1);
while (i+k<let&&j+k<let)
{
if (s[(i+k)%n]==s[(j+k)%n]) k++;
else if (s[(i+k)%n]>s[(j+k)%n])
{
i=i+k+1;
if (i<=j) i=j+1;
k=0;
}
else
{
j=j+k+1;
if (j<=i) j=i+1;
k=0;
}
}
i=i<j?i:j;
printf("%d\n",i);
}
return 0;
}