分治——Secret Cow Code S(洛谷 P3612)
题目选自洛谷P3612
梳理题意
给定一个字符串,每次将其最后一个字符移到最前方,形成的新串接到原串后作为下一次操作的字符串
现询问第 N 个位置的字符
简要分析
看一眼数据范围,N<10^18 ,显然不能模拟,所以我们从每一次操作入手
很明显,每一次操作过后,串的长度就会成为原先的两倍,所以可以想到以下这个算法。
分治
分治,即为分而治之,顾名思义,就是把一个问题分成若干个子问题,然后对每个子问题分别处理,最后再将每个子问题的结果合并起来。
那么这道题目该如何分治呢
首先,为了找到第 N 个字符,我们可以用一个 t 变量记录在什么时候字符串长度超过 N ,代码如下
while (t < n) t <<= 1; //位运算更快
通过题意可得,当第 N 个字符在长度为 tt 的字符串的后半段时,前半段字符串中的第 N−1−t/2 个字符肯定与第 N 个字符相同,因为第 N 个字符在前一次操作时就是有第 N−1−t/2 个字符转换过来的,所以我们可以由此写出以下代码
while (t != l) t >>= 1, n -= 1 + t;
但是上面这段代码离正确代码虽然接近,却又相差甚远
在原操作中,我们是将字符串的最后一个字符移到第一个后接到原串后的。倒推可得,在长度为 t 的字符串中,当 N 等于 t/2+1 时,即第 N 个字符为后半段字符串的第一个时,与之必定相同的字符位置应为 t/2 或 N−1,因此加入这个特判后的代码如下
while (t != l) {t >>= 1;if (t + 1 == n) n = t;else n -= 1 + t; }
使用三目运算符也可以简写成以下代码
while (t != l) t >>= 1, n = (t + 1 != n) ? n - 1 - t : t;
以上所有代码都是建立在第 N 个字符在长度为 tt 的字符串的后半段时,当第 N 个字符在长度为 t 的字符串的前半段时,我们就不需要做任何操作,直接将 t/2 就行了,代码如下
while (t != l) {t >>= 1;if (n <= t) continue;if (t + 1 == n) n = t;else n -= 1 + t; }
题目描述
奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。
给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。
给定初始字符串和索引,请帮助奶牛计算无限字符串中位置N的字符。
输入格式
第一行输入一个字符串。该字符串包含最多30个大写字母,并 N≤10^18 。
第二行输入N。请注意,数据可能很大,放进一个标准的32位整数可能不够,所以你可能要使用一个64位的整数类型(例如,在C / C++ 中是 long long)。
输出格式
请输出从初始字符串生成的无限字符串中的位置的字符。第一个字符是 N=1.。
输入输出样例
输入 1
COW 8
输出 1
C
解题代码:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
long long l, n, t;
char s[55];
int main() {scanf("%s%lld", s + 1, &n), l = t = strlen(s + 1);while (t < n) t <<= 1;while (t != l) t >>= 1, n = n > t ? ((t + 1 != n) ? n - 1 - t : t) : n;putchar(s[n]);return 0;
}
分治——Secret Cow Code S(洛谷 P3612)相关推荐
- [luogu p3612] [USACO17JAN]Secret Cow Code S
传送门 [USACO17JAN]Secret Cow Code S 题目描述 The cows are experimenting with secret codes, and have devise ...
- Cow Line(洛谷-P3014)
题目描述 The N (1 <= N <= 20) cows conveniently numbered 1...N are playing yet another one of thei ...
- 洛谷精选 - 字符串合集
https://www.luogu.org/problemnew/lists?name=&orderitem=difficulty&tag=2&content=0&se ...
- 洛谷【算法1-4】递推与递归
P1255 数楼梯 对于 100% 的数据,1≤N≤5000. 高精度斐波那契 #include <iostream> using namespace std;const int N = ...
- 2022-9 洛谷准备重刷
P1010 [NOIP1998 普及组] 幂次方 #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f ...
- 【洛谷】普及练习场 深度优先搜索【易】
P1219 八皇后 题目大意: 给出一个n*n的正方形棋盘,在上棋盘上放下n个皇后,要求每个皇后所在的行,列,两条对角线上没有其他皇后,输出前三种解法(按字典序排,输出结果从上到下用列号表示),并且最 ...
- 洛谷--橙色百道DP总结
最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...
- 【洛谷P2615】神奇的幻方
作者:letianJOE 题目链接 目录 题目描述 输入格式 输出格式 样例#1 样例输入 #1 样例输出 #1 样例#2 样例输入 #2 样例输出 #2(需要用宽屏来看) 提示 题目思路 样例模拟 ...
- Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...
最新文章
- 大众高层:中国将成为全球自动驾驶软件研发中心
- python基础——logging、OS、sys、random、string模块(0424)
- [问题记录] cl-api 在 CCL 中生成的文档无内容
- 计算机一级在线解析,2014年计算机一级考试MSOffice第三章考点解析 18
- Delphi XE2 之 FireMonkey 入门(2)
- Ubuntu 安装 QQ
- 深入探究.Net Core Configuration读取配置的优先级
- 【Java】浅谈JavaDoc文档注释
- MongoDB 教程番外篇之添加用户及设置用户权限 ( Rockmongo登陆设置 )
- 人工智能——数据、信息与知识
- HashMap学习之transient
- python做自动化界面_使用Python进行自动化测试如何切换窗口
- 【设计模式】组合模式 Composite Pattern
- Java 8整装待发 图谋云计算
- 去宇宙条面试被问:HashMap 为什么线程不安全?
- 5G LTE窄带物联网(NB-IoT) 10
- VM 安装win10 失败
- html怎么设置一个banner图像,css如何设置banner图自适应
- Modelsim仿真实验
- 触摸识别,智能分拣……看AI如何为垃圾分类赋能
热门文章
- windows mobile 开发 web service 未能建立与网络的连接、无法连接到远程服务器
- 解决MMC不能打开文件MSC文件(转)
- 通过深度学习检测疟疾
- web服务器 apache_如何配置Apache Web服务器
- 工具 | 终于等到你!地表最强工具来袭!
- Bootstrap 调用插件
- 安装并配置oracle11g,ORACLE11g 安装于基本配置说明
- 前端开发使用的 安卓模拟器_抖音有电脑版或者网页版吗?如何在电脑上使用抖音?...
- php调用apache,apache调用php执行系统命令
- angularjs中按回车事件_在AutoCAD中巧用空格键或回车键,制图效率高