P3612 [USACO17JAN]Secret Cow Code S

题目描述

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

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

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

输入格式

第一行输入一个字符串。该字符串包含最多30个大写字母,并 N≤10^18 。

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

输出格式

Please output the NNth character of the infinite code built from the initial string. The first character is N=1.

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

输入输出样例

输入 #1复制

COW 8

输出 #1复制

C

说明/提示

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

COW -> COWWCO -> COWWCOOCOWWC

12345678

题解

因为我们观察每一次的更新其实都是原有字符的一次翻倍,因此我们首先考虑其实至少一半的字符都是没有用处的,减半后发现n所处的原位置与砍半的字符串位置只是向右位移一位,因此向前移动即可,然后如果发现减半过后的字符串其实也是由原字符串的上一次翻倍得到,因此我们只需要不停的进行砍半,直到n已经在原有字符串范围内了,而具体对应的哪个字符,因为每次都发生了位移,因此想要确定在原有字符串的位置,那么每一次进行减半时,都要进行归位,即将n - 1

#include<bits/stdc++.h>
using namespace std;
string str;
long long n , temp;
int main(){
	cin >> str >> n;
	int len = str.size();
	while(len < n){//只要n还大于原有字符串就要不断进行砍半
		temp = len;//将原有长度用临时变量记录,不然原有长度会被改变
		while(temp * 2 < n) temp *= 2;//找到该砍半的长度
		n -= (temp + 1);//将其砍半,并进行归位
		if(!n) n = temp; //如果是最后一位直接输出最后一位
	}
	cout << str[n - 1];
	return 0;
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值