[USACO17JAN] Secret Cow Code S

题面翻译

奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。

给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。

给定初始字符串和索引,请帮助奶牛计算无限字符串中位置 \(N\) 的字符。

第一行输入一个字符串。该字符串包含最多 \(30\) 个大写字母,数据保证 \(N \leq 10^{18}\) 。

第二行输入 \(N\)。请注意,数据可能很大,放进一个标准的 \(32\) 位整数可能不够,所以你可能要使用一个 \(64\) 位的整数类型(例如,在 C/C++ 中是 long long)。

请输出从初始字符串生成的无限字符串中的位置的字符。第一个字符是 \(N=1\).。

样例 #1

样例输入 #1

COW 8

样例输出 #1

C

提示

In this example, the initial string COW expands as follows:

COW -> COWWCO -> COWWCOOCOWWC

以上为题目。

这道题题目描述很简单,就是将一个字符串的最后一个字符当作第一个字符,然后将剩下的字符复制下来。

有一个很朴素的想法,那就是模拟题目中所描述的字符串旋转的过程,创造一个长度大于N的字符串,最后直接输出Arr[N-1]即可,代码如下

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
long long N = 0;
string S;
void Solve(string& s)
{
if (s.size() >= N)
{
return;
}
int len = s.size() - 1;
s.push_back(s[s.size() - 1]);
for (int i = 0; i < len; i++)
{
s.push_back(s[i]);
}
Solve(s);
}
int main()
{
cin >> S >> N;
Solve(S);
cout << S[N-1];
return 0;
}

可想而知,如果N足够大,字符串的长度也会惊人的大,最后导致MLE。

因此,我们要想一种方法,不用真正的模拟出旋转后的字符串,而是仅通过递推来找出目标字符在未旋转字符串中的位置

不如假设经过多次旋转操作后的字符串长度为2*N

根据题目描述,则此字符串的排列有以下特点(这里我们用数字来代表单个字符)

\(1, 2, 3, 4, 5, ...,N,N+1,N+2,...,2N\)

其中,N即为旋转前字符串的最后一个字符,而N+1即为旋转后新增字符串的第一个字符,简而言之,就是

\(Str[N]==Str[N+1]\)

根据旋转的规则,显然我们有N左边的字符串和N+1右边的字符串对应相等,即\(Str[1]==Str[N+2]\),以此类推。

而且,题设中所寻找的无限字符串第K位置上的数,总是在N+1 ~ 2N范围之内,所以我们可以不断的二分缩小查找区间,让N+1 ~ 2N内的问题变为1 ~ N内的问题。

也就是对于题目 N+2<=K<=2*N, Str[K] = Str[K-N-1],而对于K==N+1的情况,要进行特判

以下为代码

#include<iostream>
#include<string>
using namespace std;
string S;
long long k, t;
void Solve(long long K)
{
//递归推出条件即为n收敛到子字符串内,便输出推出递归
if (n <= S.size())
{
cout << S[n - 1];
return;
}
long long N = S.size();
while ((N << 1) < K)N <<= 1;
//这里使用左移位替代乘2
//通过不断乘以二来试探出解题所需要的最小N(即满足使得N+1<= K<=2*N的N)
K = K - N - 1;//将问题区间缩小至1~N
if (K == 0)K = N;//对于K==N+1情况的特判
Solve(K);//继续递归缩小区间 }
int main()
{
cin >> S >> k;//数据输入
Solve(k);
return 0;
}

洛谷P3612 [USACO17JAN] Secret Cow Code S的更多相关文章

  1. 洛谷【P3612】[USACO17JAN]Secret Cow Code秘密奶牛码

    我对分治的理解:https://www.cnblogs.com/AKMer/p/9728574.html 题目传送门:https://www.luogu.org/problemnew/show/P36 ...

  2. 洛谷P3611 [USACO17JAN]Cow Dance Show奶牛舞蹈

    题目描述 After several months of rehearsal, the cows are just about ready to put on their annual dance p ...

  3. 洛谷P3605 [USACO17JAN] Promotion Counting 晋升者计数 [线段树合并]

    题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...

  4. Secret Cow code(USACO)

    题目描述:zxyer为了防止他的标程被别人抄走,他在计算机中的rar文件上设置了一个密码,其中每一个密码都有一个初始字符串,字符串由大写字母组成,且长度不超过30位,每一个密码还有一个询问,询问为一个 ...

  5. 洛谷P3608 [USACO17JAN]Balanced Photo平衡的照片

    P3608 [USACO17JAN]Balanced Photo平衡的照片 题目描述 Farmer John is arranging his NN cows in a line to take a ...

  6. 洛谷 P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…

    P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀… 题目背景 欢迎提供翻译,请直接在讨论区发帖,感谢你的贡献. 题目描述 You have probably hea ...

  7. 洛谷P1472 奶牛家谱 Cow Pedigrees

    P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备 ...

  8. 洛谷 P2888 [USACO07NOV]牛栏Cow Hurdles

    题目戳 题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the ...

  9. 洛谷P2888 [USACO07NOV]牛栏Cow Hurdles

    题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gan ...

  10. 洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)

    P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for c ...

随机推荐

  1. C# 开发桌面应用简单介绍

    一. C#使用场景介绍 C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言.运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言. 二. 开发 ...

  2. DOCKER本地仓库

    概述 随着docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker仓库的本地化应用. 试用了docker的本地仓库功能,简单易上手,记录下来以备后用. 环境 cen ...

  3. C#利用控件实现柱形图分析

    数据 { using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=;database=db_TomeOne&quo ...

  4. java项目实践-cookie-session-day18

    目录 1. cookie 2. session 3. servletcontext 4.servletConfig 1. cookie cookie 在客户端(浏览器)中保持http状态的 信息技术 ...

  5. 【C/C++】宏参数多对一和宏部分替换

    宏参数多对一:使用分号分隔多参数 宏部分替换:替换需要转换的再与后续宏接续 #include <stdio.h> #define _MESS_FAILED() printf("% ...

  6. 【ThreadX-NetX Duo】Azure RTOS NetX Duo概述

    Azure RTOS NetX Duo嵌入式TCP / IP网络堆栈是Microsoft高级的工业级双IPv4和IPv6 TCP / IP网络堆栈,专门为深度嵌入式,实时和IoT应用程序设计.NetX ...

  7. [转帖]linux 部署jmeter&报错处理

    一.linux 安装jdk Java Downloads | Oracle 二. linux上传jmeter 2.1 上传jmeter jmeter 下载地址: Apache JMeter - Dow ...

  8. 虚拟化平台IO劣化分析

    虚拟化平台IO劣化分析 背景 最近同事让帮忙做几个虚拟机进行性能测试. 本来应该搭建CentOS/Winodws平台进行相关的测试工作. 但是为了环境一致性, 使用了ESXi6.7 进行虚拟化 然后这 ...

  9. [转帖]自动化运维:一键自动化脚本-shell

    https://www.cnblogs.com/luoahong/articles/8456203.html shell函数 1.分别在服务器和客户端上创建www用户 1 2 useradd www ...

  10. [转帖]AMD第四代宵龙 9174F 亮眼

    https://www.amd.com/zh-hans/processors/epyc-9004-series#%E8%A7%84%E6%A0%BC 型号规格   型号 CPU 核心数量 线程数量 最 ...