问题描述

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

  1. 洛谷 P1709 隐藏口令

    题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并 ...

  2. 洛谷 P1709 隐藏口令Hidden Password

    ->题目链接 题解: 贪心+字符串 #include<iostream> #include<cstring> #define N 5000005 using namesp ...

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

    洛谷题目链接:[USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N< ...

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

    P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...

  5. 洛谷P1709 [USACO5.5]隐藏口令Hidden Password(最小表示法)

    题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并 ...

  6. [洛谷P5166]xtq的口令

    题目大意:给出一张有向图,保证任何时候边都是从编号大的向编号小连.两个操作: $1\;l\;r:$表示若编号在区间$[l,r]$内的点被染色了,问至少还需要染多少个点才可以使得整张图被染色.一个点会被 ...

  7. 洛谷P2402 奶牛隐藏

    洛谷P2402 奶牛隐藏 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛混乱的原因看题目描述) 题目描述 在一个农场里有n块田地. ...

  8. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  9. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

随机推荐

  1. docker-dnsmasq使用

    docker-dnsmasq支持通过web页面配置域名映射,镜像地址:https://hub.docker.com/r/jpillora/dnsmasq 使用步骤如下: 1.在Docker宿主上创建 ...

  2. xml基础之二(XML结构【1】)

    xml基础之二(XML结构[1]) 新建 模板 小书匠  XML结构 XML结构 1.1 元素:被开始标签和结束标签所包裹的内容,(红色部分),蓝色部分也是元素,由于其仅有词语和句子,可细分为文本元素 ...

  3. Java操作数据库之JDBC增删改查

    1.java连接MySql数据库 代码区域: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  4. js高级写法

    名称 一般写法 优化 取整(不四舍五入) parseInt(a,10); //Before Math.floor(a); //Before a>>0; //Before ~~a; //Af ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_4_Map集合遍历键找值方式

    键找值的方式 增强for 增强for的简化方式

  6. 如何在idea中查看jar包源码

    文章目录 准备jar包 idea打开文件夹 最后一步 准备jar包 例如,我准备看resin的jar,在桌面准备了一份 idea打开文件夹 在idea中file====>open=====> ...

  7. Hand on Machine Learning 第二章:端到端的机器学习

    1.import 模块 import os import tarfile from six.moves import urllib import pandas as pd pd.set_option( ...

  8. C#后台保存Cookie

    一般是: Response.Cookies["backurl"].Expires.AddDays(2); 但是,IE浏览器保存Cookie用 Response.Cookies[&q ...

  9. jQ判断checked是否选中

    (1).JQ1.6版本之前(不包括1.6版本)判断checkbox是否被选中用的是attr()方法,HTML代码与上面相同,只放JQ代码: console.log($("input[type ...

  10. Spring Boot系列(三) Spring Boot 之 JDBC

    数据源 类型 javax.sql.DataSource javax.sql.XADataSource org.springframework.jdbc.datasource.embedded,Enbe ...