隐藏密令 计蒜客

有一种密令,会选择一个由L个小写字母组成的字符串,然后把字符串顺时针绕成一个圈,每次取一个做开头字母并顺时针依次取字母而组成一个字符串。这样将得到一些字符串,他把它们排序后取出第一个字符串。把这个字符串的第一个字母在原字符串中的位置做为密令。
第一个字母所在的位置是0,如字符串alabala,按操作得到7个字符串,排序后得:
aalabal abalaal alaalab alabala balaala laalaba labalaa
第一个字符串为aalabal,这个a在原字符串位置为6,则6为密令。 当字符串相同时,输出编号最小的(即对于aaaa输出0)。
输入第一行包括一个整数L(5≤L≤100000),从第二行往后是由L个小写字母组成的那个字符串,每满72个小写字母换一行。
输出包括一行,为得到的密令。
样例1
输入:
7
alabala
输出:
6

 

 

#include<stdio.h>
int main(){
   int n;
   char p[100000];
   int i=0;
   scanf("%d",&n);
 while(i<n){
    if((p[i]=getchar())!='\n')
      i++;
 }
 p[i]='\0';
   int min;      //记录最小字符串地址
   int c;    //当前字符串地址
   min=0;
   c=min+1;
   i=0; //移动地址
 while(1){
    if(p[(min+i)%n]>p[(c+i)%n]){
    min=c;
    c=min+1;
    if(c>=n) break;
    i=0;
  }
  else if(p[(min+i)%n]==p[(c+i)%n]){
     i++;
   if(i>n){
    break;
   }
  }
   else{
      c=c+i+1;
      i=0;
   } 
 }
   printf("%d\n",min);
   return 0;
}

posted on 2018-04-11 20:48  沙漏,为谁转  阅读(184)  评论(0)    收藏  举报

导航