P3612 - [USACO17JAN] Secret Cow Code S

这篇文章介绍了如何使用C++实现一个高效的算法,根据题目要求,先复制最后一个字符,然后复制其前缀,通过三目运算符和条件判断简化代码,以减少重复并确保n在字符串范围内的操作。
摘要由CSDN通过智能技术生成

题解

#include<iostream>
#include<string>
using namespace std;

int main() {
	string s; cin >> s;
	long long n; cin >> n;
	//确定len, len的大小为 len/2< n <=len ,而且len为 m.length()的倍数
	long long len = s.length();
	while (len < n) len <<= 1;
    
	while (n > s.length()) {
		len >>= 1;//提前处理
		if (n > len)//n在字符串的后半段的情况,
		{
			if (n == len + 1) {
				n = len;
			}
			else {
				n -= len + 1;
			}
		}
		else {//n在字符串的前半段,只需len/2即可,因为对n操作后,会出现这种情况
			continue;
		}
	}
	cout << s[n - 1];
	return 0;
}

题目要求翻译为: 先复制最后一个字符,在复制它的前缀,以此为思路,

分成两种情况

  1. 最后一个字符,
  2. 他的前缀

这两种请何况都是为复制后的前半部分,后半部分为分为第一个字符和他的后缀

通过不断的缩小n的大小到原字符串的范围内

  1. 当n在字符串的后半部分时

    • n为后半部分的第一位,那么缩小的方式为(把n变为前半部分的最后一位),即n变为len/2;
    • n在(后半部分的)的第一位的后缀,n变为 n-len-1;
  2. 当n在字符串的前半部分时 把len/2,以保证n在len的后半部分

三目运算符简化

只要是 i f ( ) { } e l s e { } if()\{\}else\{\} if(){}else{} 情况都可以变为 ( ? : ) ( ? :) (?:)

第一个简化

if (n == len + 1) {
	n = len;
}
else {
    n -= len + 1;
}

简化为

n = (n == len - 1 ? n = len : n - len - 1);

第二个简化

if (n > len){
	n = (n == len - 1 ? n = len : n - len - 1);//第一个简化
}
else {
	continue;
}

简化为

n = (n > len ? (n == len - 1 ? n = len : n - len - 1) : n);

最终为

#include<iostream>
#include<string>
using namespace std;

int main() {
	string s; cin >> s;
	long long n; cin >> n;
	long long len = s.length();
	while (len < n) len <<= 1;
	while (n > s.length()) {
		len >>= 1;
		n = (n > len ? (n == len - 1 ? n = len : n - len - 1) : n);
	}
	cout << s[n - 1];
	return 0;
}
  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值