[洛谷P1709] 隐藏的口令
问题描述
有时候程序员有很奇怪的方法来隐藏他们的口令。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个字符一个换行符)
输出格式
一行,为得到的口令
样例输入
7
anabana
样例输出
6
数据范围
题目满足:
30%的数据n<=10000
70%的数据n<=100000
100%的数据n<=5000000
解析
暴力的做法很好想。为了贪心,我们要保证每一位最小,就是每次用一个位置与当前最优的位置进行比较,如果相同就不断比较之后的字符,否则就可以更新最优解或继续往下枚举。
但这样显然会超时。仔细分析过程可以发现,我们可以如下来设计:
对于这个字符串,我们定义两个指针分别为 i 和 j 分别指向 ‘a’ 和 ’n’ 即 i = 0 j = 1 再定义一个累加器 k 则表示分别以 i 和 j 为首的字符串的第 k 个字符.根据贪心思想,每一项显然要选最小的最好。在这里 ’n’ 的字典序大于 ’a’ 那么j显然不会是我们所要的答案那么我们就对j进行移位即 j++接下来我们便重复上面的操作
因为 i 和 j 所指的值是相同的,所以我们并不能通过比较这一位从而得出这两个字符串的顺序关系所以我们就要对 k 进行移位即 k++。我们对 i+k 和 j+k 所指的字符进行比较,显然可以得出 ’b’ 是比 ’n’ 要更优的那么这时候我们就要对i进行移位,因为在 [i ,i+k) 内我们都已经判断完了,那么我们就可以将 i 移到 i+k+1 继续接下来的判断。
但是我们还要考虑以下几个问题
- 当i=j时,我们的操作便无法正常的运行,因为显然的在i=j时,i+k=j+k,这样的话我们的k就会不断的增加从而导致WA
- i+k 和 j+k是可能越界的
- k是可能大于length的
解决方法如下:
- 当i=j时,j++
- 只要将i+k和j+k Mod length即可
- 限制k < length ,在k = length 直接返回i和j中位置较前的即可
代码
#include <iostream>
#include <cstdio>
#define N 5000002
using namespace std;
int n,i,j=1,k;
char c[N];
int main()
{
cin>>n;
for(i=0;i<n;i++) cin>>c[i];
i=0;
while(i<n&&j<n){
k=0;
while(c[(i+k)%n]==c[(j+k)%n]&&k<n) k++;
if(k==n) break;
if(c[(i+k)%n]>c[(j+k)%n]) i=i+k+1;
else j=j+k+1;
if(i==j) j++;
}
cout<<min(i,j)<<endl;
return 0;
}
[洛谷P1709] 隐藏的口令的更多相关文章
- 洛谷 P1709 隐藏口令
题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并 ...
- 洛谷 P1709 隐藏口令Hidden Password
->题目链接 题解: 贪心+字符串 #include<iostream> #include<cstring> #define N 5000005 using namesp ...
- [洛谷P1709] [USACO5.5]隐藏口令Hidden Password
洛谷题目链接:[USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N< ...
- 洛谷 P1709 [USACO5.5]隐藏口令Hidden Password
P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...
- 洛谷P1709 [USACO5.5]隐藏口令Hidden Password(最小表示法)
题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并 ...
- [洛谷P5166]xtq的口令
题目大意:给出一张有向图,保证任何时候边都是从编号大的向编号小连.两个操作: $1\;l\;r:$表示若编号在区间$[l,r]$内的点被染色了,问至少还需要染多少个点才可以使得整张图被染色.一个点会被 ...
- 洛谷P2402 奶牛隐藏
洛谷P2402 奶牛隐藏 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛混乱的原因看题目描述) 题目描述 在一个农场里有n块田地. ...
- 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)
洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
随机推荐
- linux管理权限
1.linux命令查询 root id 2.切换用户 su - xiaobai 一定要加" - "这个会将你的所有环境变量都带过来 3.root用户切换普通用户不需要输入密码反 ...
- Python字典的json格式化处理(换行与不换行)
Prefer = {"jim": {"War": 1.9, "the big bang": 1.0, "The lord of w ...
- Delphi XE2 之 FireMonkey 入门(8) - TImage
TImage 主要成员: { 属性 } Bitmap : TBitmap; //图像 BitmapMargins : TBounds; ...
- postman+newman+jenkins接口自动化
postman用来做接口测试非常方便,接口较多时,则可以实现接口自动化 目录 1.环境准备 2.本机调试脚本 3.集成jenkins 1.环境准备 1.1安装nodejs6.0+ 安装nodejs6. ...
- GUI_FlowLayout
void setBounds(x, y, width, height) 设置窗体坐标,窗体大小 import java.awt.Frame; public class IntegerDemo { pu ...
- try...catch语句
程序的异常:Throwable 严重问题Error我们不处理,这种问题一般都是很严重的,比如内存溢出 问题Exception 编译期问题不是RuntimeException的异常必须进行处理,如果不处 ...
- netcore2.1 在后台运行一个任务
在 ASP.NET Core 2.1中, 提供了一个名为BackgroundService的类,在 Microsoft.Extensions.Hosting命名空间中,其代码为 namespace M ...
- 今天起,重新开头学习Java - 一、安装环境
先拜领路人 https://blog.csdn.net/u011541946/article/category/6951961/3? 一.安装JDK 1. 下载 www.java.com JDK是Ja ...
- JMeter学习笔记16-如何输出HTML格式的性能测试报告
文本来学习下,如何输入HTML格式的JMeter测试报告.前面已经介绍, 如果要做性能测试,需要在GUI上设计好你的Test Plan,设置各种场景和负载值,包括多少个线程,多少个用户,循环多少次.设 ...
- Log4net使用(一)
转自:http://blog.csdn.net/much0726/article/details/3725563 转自:https://q.cnblogs.com/q/52302/ log4net,既 ...