洛谷 P1709 [USACO5.5]隐藏口令Hidden Password
2024-10-01 19:46:28
题目描述
有时候程序员有很奇怪的方法来隐藏他们的口令。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个字符一个换行符)
输出格式:
一行,为得到的口令
输入输出样例
说明
题目满足:
30%的数据n<=10000
70%的数据n<=100000
100%的数据n<=5000000
时限 1s
题目翻译来自NOCOW。
USACO Training Section 5.5
//20170523新增数据四组
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 5000010
using namespace std;
int n,len,ans,l,r;
char s[MAXN],c;
int main(){
scanf("%d",&n);
n--;
for(int i=;i<=n;i++){
cin>>c;
s[i]=c;
}
for(int i=;i<=n;i++){
l=ans;r=i;
while(s[l]==s[r]){
l++;r++;
if(l>n) l=;
if(r>n) r=;
if(r==i) break;
}
if(s[l]>s[r]) ans=i;
}
printf("%d",ans);
}
/*
7
alabala
*/
90分的暴力
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int n;
char s[maxn];
int Mini(int l){
int i,j,k;
i=;j=;k=;
while(i<l&&j<l){
k=;
while(s[(i+k)%l]==s[(j+k)%l]&&k<l) k++;
if(k==l) return (i<j)?i:j;
if(s[(i+k)%l]>s[(j+k)%l]) i=i+k+;
else j=j+k+;
if(i==j) j++;
}
return (i<j)?i:j;
}
int main(){
cin>>n;
for(int i=;i<n;i++) cin>>s[i];
int l=Mini(n);
cout<<l<<endl;
return ;
}
最新文章
- 对 Serializable和Parcelable理解
- js replaceAll
- chrome调试hove等类似事件
- 在docker里面安装部署应用
- 十大技巧快速提升原生APP开发性能
- 【linux程序设计4th】第三章1
- 配置mybatis流程
- OpenGL光源位置
- 设计模式之装饰者模式(Decorator Pattern)
- 【转】Android JNI编程—JNI基础
- NuGet学习笔记(1)——初识NuGet及快速安装使用(转)
- 系统学下POWERSHELL吧,工作当中可能用得到呢。不能像以前那样修修改改了。
- python高级编程之超类02:super的缺陷
- firebug登陆之数据包分析
- 转:loadruner报错:Step download timeout(120 seconds)的一个解决方法
- 微信小程序-开发入门
- 如何通过java反射的方式对java私有方法进行单元测试
- 【Codeforces Round 431 (Div. 2) A B C D E五个题】
- java1.8十大新特性详解
- 【BZOJ4030】[HEOI2015]小L的白日梦