最强阵容加强版

来源:互联网 发布:怎么看自己的淘宝信誉 编辑:程序博客网 时间:2024/04/29 00:10

题目描述
拿着新换来的英雄卡,小李满心欢喜的准备和同学们PK一下。
他们的游戏规则非常简单,双方把自己的牌绕成一圈,然后指定一个起点,从该张牌开始顺时针方向往后取,谁取出的字符串字典序更小(从左到右开始比较,碰到第一个不一样的字符进行比较,比较规则为a < b <…< z)谁将获得胜利。具体规则可参考样例。虽然现在小李的牌已经很好了,但是你能不能帮他快速算出起始位置,使得他能够派出最强阵容。

输入
第一行n,表示共有n张牌。
第二行共n个用一个空格隔开的小写字母,表示给定的一圈牌起始序列。

输出
仅一个整数,能获得最小字典序字符串的起点位置。如果有多个位置开始的字符串一样,则输出最小的那个位置,且第一个位置从1开始。

样例输入
4
b c a b
样例输出
3
提示
【样例说明】

四个位置取出的字符串分别为bcab,cabb,abbc,bbca,显然最小位置是3。

【数据规模】

30%的数据,1<=n<=10

60%的数据,1<=n<=1000

100%的数据,1<=n<=300000

#include<iostream>#include<cstdio>using namespace std;char a[1000005];int MinimumRepresentation(char *s, int l){    int i=0,j=1,k=0,t;    while(i<l&&j<l&&k<l){      t=s[(i+k)>=l?i+k-l:i+k]-s[(j+k)>=l?j+k-l:j+k];      if(!t) k++;      else{        if(t>0) i=i+k+1;        else j=j+k+1;        if(i==j) ++j;        k=0;      }    }    return (i<j?i:j);  }int main(){  int n;  scanf("%d\n",&n);  int k=-1;  while(k!=n){    char c;    c=getchar();    if(c!=' '){      k++;      a[k]=c;    }    if(k==n) break;  }  cout<<MinimumRepresentation(a,n)+1<<endl;  return 0;}
原创粉丝点击