最强阵容加强版

题目描述
拿着新换来的英雄卡,小李满心欢喜的准备和同学们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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值