P3612 [USACO17JAN] Secret Cow Code S

发布时间 2023-12-23 18:54:15作者: 拍手称快

P3612 [USACO17JAN] Secret Cow Code S

自我感想

哎,又是一道写不出来的。
完全没有这样的思路,只会笨b模拟只能得40.

解题前应该的思考

通过题目给的数据可以知道纯暴力模拟肯定爆空间。(基本否定正推)
这里根据题目所说的,其实可以知道是一个初字符串通过固定的规律形成新的字符串。(明显需要有一个推导过程使巨大数据一步一步减少)。
这里的思路可以将可能是一个大的n逆推回小n(即比给定字符串长度小的),通过比较关系,就可得到起始的n在给定字符串长度内的位置,就可得到题目所要的。

实现的流程

先处理字符串长度设其为m,使其按题目要求倍增至m<=n<=2*m;
这里用n-m所对应的在m2m的位置对应着m/2m的位置,推导关系,并对m实时更新为次一级字符串长度。

#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <iomanip>
using namespace std;


int main() {
	string s;
	cin >> s;
	long long n, num, m;
	cin >> n;
	m = s.length();
	num = m;
	while (m < n) {
		m *= 2;
	}
	m /= 2;//寻找满足m<n<2m的值.
	while (n > num) {//下面为推导的前后字符串位置所对应的位置关系
		if (n == m) {
			n = m;
		} else if (n - m > 1) {
			n = n - m - 1;
		} else if (n == m + 1) {
			n = m;
		}
		m /= 2;//更新m使其为次级字符串
	}
	cout << s[n - 1];
	return 0;
}