P1709 [USACO5.5]隐藏口令Hidden Password

题目描述

有时候程序员有很奇怪的方法来隐藏他们的口令。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

题目翻译来自NOCOW。

USACO Training Section 5.5

//20170523新增数据四组

思路

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=5000010;

int n;
char s[N];

int MIN(int len) {
	int i=0,j=1,k=0;
	while(i<len&&j<len) {
		k=0;
		while(s[(i+k)%len]==s[(j+k)%len]&&k<len)
			k++;
		if(k==len)
			return (i<j)?i:j;
		if(s[(i+k)%len]>s[(j+k)%len])
			i=i+k+1;
		else
			j=j+k+1;
		if(i==j)
			j++;
	}
	return (i<j)?i:j;
}

int main () {
	scanf("%d",&n);
	//scanf("%s",s);
	for(int i=0; i<n; i++)
		cin>>s[i];
	//scanf("%c",&s[i]);
	int ans=MIN(n);
	printf("%d\n",ans);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11826169.html
今日推荐