本地能通过但是提交WA
查看原帖
本地能通过但是提交WA
1195979
tyiii楼主2024/4/11 11:09
#define  _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
#define int long long

string s;
int n, siz, m, a[100000], top, cnt, tot;

int work(int num) {
	int b = siz;
	while (b < num) {
		b <<= 1;
	}
	b >>= 1;
	num = num - b - 1;
	if (num == 0) return b;
	return num;
}

int work1(int num) {
	int temp = 0;
	for (int i = 1; i <= top; ++i) {
		if (a[i] < num) continue;
		temp = a[i];
		temp >>= 1;
		if (a[i - 1] == (a[i] >> 1)) cout << "asd";
		num = num - temp - 1;
		if (num == 0) return temp;
		return num;

	}


}

signed main() {
	cin >> s >> n;
	siz = s.size();


	m = n;
	a[++top] = siz;
	tot = siz;
	while (a[top] <= m) {
		a[++top] = (a[top - 1] << 1);
	}

	while (m > siz) {
		m = work1(m);
	}


	while (n > siz) {
		n = work(n);
	}
	cout << s[n - 1];
	if (n != m) cout << "zxc";



	return 0;
}

这是一个神奇的代码,提交到洛谷的测评机能够AC,但是本地编译后却有可能得到预期以外的结果,比如输入数据COW 8在本地你可能会得到asdC 如果本地你获得了asdC这个答案,请接着往下看,这会解决你的疑惑 我正经不下去了, 简单的说就是 a[++top] = (a[top - 1] << 1); 这一行代码,洛谷的编译器解释是先获取top-1的值,然后再递增top, 而本地本地编译器是先递增后获取top-1的值,前者++top与top-1相差而, 如果第一个数字为3, 获得的序列应该为3, 0, 6, 0, 12, 本地则是3, 6, 12. 说的比较乱,大概没错的话就是这样了

2024/4/11 11:09
加载中...