General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
127801855 Practice:
Czhgugugu
472G - 16 C++17 (GCC 9-64) Accepted 4070 ms 165936 KB 2021-09-04 02:27:01 2021-09-04 02:27:01
→ Source
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair <int, int> pin;

#ifndef ONLINE_JUDGE
bool MEMORY_ST;
#endif

const int N = 2e5 + 5;
const int M = 205;
const int L = 64;
const int W = L - 1;
const ll P = 998244353LL;

int n, m, cnt, qn, ln[M], rn[M], bel[N], ans[N][M];
char sa[N], sb[N];

struct Bitset {
    int siz;
    ull bit[N >> 6];

    inline void build(char *s) {
        memset(bit, 0, sizeof(bit));
        int len = strlen(s);
        for (; len & W; len++) s[len] = '0';
        ull cur = 0;
        siz = 0;
        for (int i = 0; i < len; i++) {
            cur <<= 1;
            if (s[i] == '1') cur |= 1;
            if ((i & W) == W) {
                bit[siz++] = cur;
                cur = 0;   
            }
        }
        // printf("%d\n%llu\n", n, bit[0]);
    }

    inline ull get(int p, int len) {
        if (len == L) {
            if (!(p & W)) return bit[p >> 6];
            int s = p >> 6, r = p & W;
            ull mask = (1ULL << (L - r)) - 1, hmask = ULLONG_MAX ^ mask;
            return (bit[s] << r) | ((bit[s + 1] & hmask) >> (L - r));
        } else {
            assert(len < L);
            int d = L - len;
            ull res;
            if (!(p & W)) res = bit[p >> 6];
            else {
                int s = p >> 6, r = p & W;
                ull mask = (1ULL << (L - r)) - 1, hmask = ULLONG_MAX ^ mask;
                res = (bit[s] << r) | ((bit[s + 1] & hmask) >> (L - r)); 
            }
            res >>= d;
            return res;
        }  
    }

} a, b;

inline void bp(ull x) {
    vector <int> t;
    for (int i = 0; i < 64; i++, x >>= 1) t.emplace_back(x & 1);
    reverse(t.begin(), t.end());
    for (int i = 0; i < t.size(); i++)
        printf("%d", t[i]);
    puts("");
}

inline int shiftxor(int p1, int p2, int len) {
    int res = 0;
    for (; len > 0; ) {
        if (len >= L) {
            ull cur1 = a.get(p1, L), cur2 = b.get(p2, L);
            // printf("%llu %llu\n", cur1, cur2);
            // bp(cur1), bp(cur2);
            res += __builtin_popcountll(cur1 ^ cur2);
            p1 += L, p2 += L, len -= L;
        } else {
            ull cur1 = a.get(p1, len), cur2 = b.get(p2, len);
            // bp(cur1), bp(cur2);
            // printf("%llu %llu\n", cur1, cur2);
            res += __builtin_popcountll(cur1 ^ cur2);
            p1 += len, p2 += len, len = 0;
        }
    }
    return res;
}

inline int solve(int p1, int p2, int len) {
    int l = p2, r = p2 + len - 1;
    if (bel[l] == bel[r]) return shiftxor(p1, p2, len);
    else {
        int res = 0;
        res += shiftxor(p1, p2, rn[bel[l]] - l + 1);
        p1 += rn[bel[l]] - l + 1, p2 += rn[bel[l]] - l + 1;
        for (int i = bel[l] + 1; i <= bel[r] - 1; i++) {
            assert(p2 == ln[i]);
            res += ans[p1][i];
            p1 += rn[i] - ln[i] + 1, p2 += rn[i] - ln[i] + 1;
        }
        assert(p2 == ln[bel[r]]);
        res += shiftxor(p1, p2, r - ln[bel[r]] + 1);
        p1 += r - ln[bel[r]] + 1, p2 += r - ln[bel[r]] + 1;
        assert(p2 == r + 1);
        return res;
    }
}

#ifndef ONLINE_JUDGE
bool MEMORY_ED;
#endif

int main() {
#ifndef ONLINE_JUDGE
    freopen("sample.in", "r", stdin);
    freopen("sample.out", "w", stdout);
    clock_t st_clock = clock();
#endif

    scanf("%s", sa);
    scanf("%s", sb);
    a.build(sa), b.build(sb);
    n = a.siz * L, m = b.siz * L;
    const int block = 8000;
    cnt = m / block;
    for (int i = 1; i <= cnt; i++) {
        ln[i] = rn[i - 1] + 1;
        rn[i] = i * block;
    }
    if (m % block != 0) {
        ++cnt;
        ln[cnt] = rn[cnt - 1] + 1;
        rn[cnt] = m;
    }
    for (int i = 1; i <= cnt; i++) {
        --ln[i], --rn[i];
        for (int j = ln[i]; j <= rn[i]; j++) 
            bel[j] = i;
    }
    // for (int i = 1; i <= cnt; i++)
    //     printf("%d %d\n", ln[i], rn[i]);
    for (int i = 0; i < n; i++)
        for (int j = 1; j <= cnt; j++) {
            ans[i][j] = shiftxor(i, ln[j], min(rn[j] - ln[j] + 1, n - i));
        }
    // for (int i = 1; i <= cnt; i++)
    //     printf("%d %d\n", ln[i], rn[i]);

    scanf("%d", &qn);
    for (int p1, p2, len; qn--; ) {
        scanf("%d%d%d", &p1, &p2, &len);
        printf("%d\n", solve(p1, p2, len));
    }

#ifndef ONLINE_JUDGE
    clock_t ed_clock = clock();
    printf("time = %f ms\n", (double)(ed_clock - st_clock) / CLOCKS_PER_SEC * 1000);
    printf("memory = %.2f MB\n", (&MEMORY_ED - &MEMORY_ST) / 1024.0 / 1024.0);
#endif
    return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details