本地能通过但是提交WA

P3612 [USACO17JAN] Secret Cow Code S

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. 说的比较乱,大概没错的话就是这样了


|