洛谷P3612 [USACO17JAN] Secret Cow Code S
[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的更多相关文章
- 洛谷【P3612】[USACO17JAN]Secret Cow Code秘密奶牛码
我对分治的理解:https://www.cnblogs.com/AKMer/p/9728574.html 题目传送门:https://www.luogu.org/problemnew/show/P36 ...
- 洛谷P3611 [USACO17JAN]Cow Dance Show奶牛舞蹈
题目描述 After several months of rehearsal, the cows are just about ready to put on their annual dance p ...
- 洛谷P3605 [USACO17JAN] Promotion Counting 晋升者计数 [线段树合并]
题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...
- Secret Cow code(USACO)
题目描述:zxyer为了防止他的标程被别人抄走,他在计算机中的rar文件上设置了一个密码,其中每一个密码都有一个初始字符串,字符串由大写字母组成,且长度不超过30位,每一个密码还有一个询问,询问为一个 ...
- 洛谷P3608 [USACO17JAN]Balanced Photo平衡的照片
P3608 [USACO17JAN]Balanced Photo平衡的照片 题目描述 Farmer John is arranging his NN cows in a line to take a ...
- 洛谷 P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…
P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀… 题目背景 欢迎提供翻译,请直接在讨论区发帖,感谢你的贡献. 题目描述 You have probably hea ...
- 洛谷P1472 奶牛家谱 Cow Pedigrees
P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备 ...
- 洛谷 P2888 [USACO07NOV]牛栏Cow Hurdles
题目戳 题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the ...
- 洛谷P2888 [USACO07NOV]牛栏Cow Hurdles
题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gan ...
- 洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)
P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for c ...
随机推荐
- spring-transaction源码分析(4)AspectJ和spring-aspects模块
AspectJ是Java语言实现的一个面向切面编程的扩展库,能够基于一定的语法编写Aspect代码,使用ajc编译器将其编译成.class文件,之后在Java程序编写或加载时将Aspect逻辑嵌入到指 ...
- java - 对象装载数据传递到方法中
1. 创建 Phone 类 package class_object; public class Phone { String brand; String color; double price; v ...
- 初次安装Linux 1Panel面板体验
初次安装Linux 1Panel面板体验 1Panel是Linux下的一款服务器管理工具.和宝塔相比更加轻量化.相比之下各有优点,本文让我们一起来安装1Panel面板. 面板优势 快速建站 :深度集成 ...
- 海思Hi35xx 实现本地和远程升级程序的方法
前言 嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级. 本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级. 这里介绍一种同时至此本地和 ...
- [转帖]MySQL: Convert decimal to binary
Last Update:2018-12-05 Source: Internet Author: User Tags decimal to binary mysql code Developer on ...
- [转帖]Linux系统安装之后,如何调节CPU性能策略
https://baize.cc/posts/efc.html#:~:text=Linux%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E4%B9%8B%E5%90%8E% ...
- ext4 扩容磁盘的方式方法
ext4 扩容磁盘的方式方法 背景 前期一直处理xfs,lvm磁盘的扩容 很少处理ext4的磁盘扩容 今天发现自己竟然对这一块有盲区. 晚上回家自己学习研究了会儿, 发现知识点还挺多 所以总结一下. ...
- 【转帖】Linux多链路聚合技术
https://www.jianshu.com/p/dd8587ecf54f 一般而言,在单体结构的操作系统中,一块物理磁盘会接在总线设备上,并经由总线分配 PCI-Bus 号,这个时候一个 bus ...
- 理解Vuex的辅助函数mapState
参考的地址是: https://www.cnblogs.com/tugenhua0707/p/9794423.html 之所以会在这里记录下来,是为了方便自己以后忘记的时候查看学习而已~: 并没有别的 ...
- Fabric区块链浏览器(2)
本文是区块链浏览器系列的第四篇. 在上一篇文章介绍如何解析区块数据时,使用session对客户端上传的pb文件进行区分,到期后自动删除. 在这片文章中,会着重介绍下认证系统的实现,主要分为三部分: 添 ...