tyiii @ 2024-04-11 11:09:53
#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.
说的比较乱,大概没错的话就是这样了