hunnu 小明的烦恼——找字符串

http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11544&courseid=0

小明的烦恼——找字符串
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 108, Accepted users: 68
Problem 11544 : No special judgement
Problem description
  小明是个很优秀的同学,他除了特别公正外,他也很细心,当然老师肯定也知道,这不,老师又有事情找他帮忙了,老师每周都会给他一个字符串A,然后问小明“A字符串的循环移位产生的所有字符串中,字典序最小的是哪个”,于是小明屁颠屁颠的一个一个比对,但是长久下来,小明实在是受不了了,所以他想请你帮帮他。同样,你帮他解决,你就会多AC一个题目。 
Hint:
如果A字符串为bcda,那么其所有的循环移位的新字符串有cdab,dabc,abcd,和他自己bcda一共四个,然后在这四个中,字典序最小的为abcd,那么输出这个字符串中的第一次字符在原字符串中的位置,为3,如果有多个结果,输出数字最小的。 

Input
  输入有T组, 以后每组第一行有一个字符串S,长度<=5000000,都是小写字母。

Output
  对于每一个case,输出结果。

Sample Input
4
bcda 
aaa
a
adab
Sample Output
3
0
0
2
Problem Source
  HUNNU Contest 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[5000000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
     int len=strlen(str);
     int i=0,j=1,k=0;
      while(i<len&&j<len&&k<len)
     {
         int l=str[(i+k)%len]-str[(j+k)%len];
         if(l==0)
           {
               k++;
           }
         if(l>0)
         {
             i=i+k+1;
             k=0;
         }
         if(l<0)
         {
           j=j+k+1;
            k=0;
         }
         if(i==j)
          {
              j++;
          }

     }
     printf("%d
",min(i,j));

    }
  return 0;
}
原文地址:https://www.cnblogs.com/cancangood/p/4563959.html