Problem description |
小明是个很优秀的同学,他除了特别公正外,他也很细心,当然老师肯定也知道,这不,老师又有事情找他帮忙了,老师每周都会给他一个字符串A,然后问小明“A字符串的循环移位产生的所有字符串中,字典序最小的是哪个”,于是小明屁颠屁颠的一个一个比对,但是长久下来,小明实在是受不了了,所以他想请你帮帮他。同样,你帮他解决,你就会多AC一个题目。 Hint: 如果A字符串为bcda,那么其所有的循环移位的新字符串有cdab,dabc,abcd,和他自己bcda一共四个,然后在这四个中,字典序最小的为abcd,那么输出这个字符串中的第一次字符在原字符串中的位置,为3,如果有多个结果,输出数字最小的。 |
Input |
输入有T组, 以后每组第一行有一个字符串S,长度<=5000000,都是小写字母。 |
Output |
对于每一个case,输出结果。 |
Sample Input |
|
Sample Output |
|
Problem Source |
HUNNU Contest |
#include<iostream>
#include<stdlib.h>
#include<string.h>
//#include<cstdin>
using namespace std;
const int N=5000000+10;
char a[N];
void solve(){
int len=strlen(a);
int i=0,j=1,k=0;
while(i<len&&j<len&&k<len){
// printf("%d %d %d\n",i,j,len);
int s= a[(i+k)%len]-a[(j+k)%len];
if(s==0){
k++;
continue;
}else if(s>0){
i+=k+1;
k=0;
}else{
j+=k+1;
k=0;
}
if(i==j){
j++;
}
}
if(i<j){
printf("%d\n",i);
}else{
printf("%d\n",j);
}
}
int main(){
int n;
// freopen("in.txt","r",stdin);
scanf("%d",&n);
// getchar();
while(n--){
scanf("%s",a);
solve();
}
return 0;
}
注意取余
另外,每次比完之后,换一个新的位置继续比
有多余空格,最好不要用gets