题目描述
有时候程序员有很奇怪的方法来隐藏他们的口令。Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并顺时针依次取字母而组成一个字符串。这样将得到一些字符串,他把它们排序后取出第一个字符串。把这个字符串的第一个字母在原字符串中的位置-1做为口令。
如字符串alabala,按操作的到7个字符串,排序后得:
aalabal
abalaal
alaalab
alabala
balaala
laalaba
labalaa
第一个字符串为aalabal,这个a在原字符串位置为7,7-1=6,则6为口令。
输入输出格式
输入格式:第一行:一个数:N
第二行开始:字符串:S(每72个字符一个换行符)
输出格式:一行,为得到的口令
输入输出样例
输入样例#1:
7 anabana
输出样例#1:
6
说明
题目满足:
30%的数据n<=10000
70%的数据n<=100000
100%的数据n<=5000000
时限 1s
贪心,字符串;感觉思维过程类似next数组,,,,
设指针i,j指向两个字母表示比较这两个字母开头的串的asc
直接将i,j指向asc最小的那两个字母s[i]和s[j]设k,在s[i+k]=s[j+k]相同时,k++,比较后续位
如果k=l,说明两个串asc完全一样且asc均为最小,那么ans=i和j小的那个
如果s[i+k]>s[j+k]那么i就不是较小,那就可以让i=i+k+1;可以跳很多,因为s[i]是最小的asc,其间肯定没有<=s[i]的asc;
反之同理j=j+k+1
如果i=j,则让j++;
一直如此循环,直到i或j超过l,那么那个小于l的就是答案
注:防止i+k,j+k值超过l,所以比较的时候模一下l