Submission #828477

#TimeUsernameProblemLanguageResultExecution timeMemory
828477joelgun14Lottery (CEOI18_lot)C++17
100 / 100
514 ms12100 KiB
// header file
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// pragma
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
// macros
#define endl "\n"
#define ll long long
#define mp make_pair
#define ins insert
#define lb lower_bound
#define pb push_back
#define ub upper_bound
#define lll __int128
#define fi first
#define se second
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
int main() {
    ios_base::sync_with_stdio(0); cin.tie(NULL);
    int n, l;
    cin >> n >> l;
    int a[n + 1];
    for(int i = 1; i <= n; ++i)
        cin >> a[i];
    int que;
    cin >> que;
    pair<int, int> q[que];
    for(int i = 0; i < que; ++i)
        cin >> q[i].fi, q[i].se = i;
    sort(q, q + que);
    int allow[l + 1];
    memset(allow, -1, sizeof(allow));
    for(int i = 0; i < que; ++i) {
        if(allow[q[i].fi] == -1)
            allow[q[i].fi] = i;
    }
    for(int i = l - 1; i >= 0; --i) {
        if(allow[i] == -1)
            allow[i] = allow[i + 1];
    }
    // given compare substring shift by x
    // size l - 1
    int cnt[que][n + 1];
    memset(cnt, 0, sizeof(cnt));
    for(int i = 1; i <= n; ++i) {
        // try for every length i
        // geser
        int idx1 = 1, idx2 = 1 + i, diff = 0;
        if(idx2 + l - 1 > n)
            break;
        for(int j = 0; j < l; ++j) {
            if(a[idx1 + j] != a[idx2 + j])
                ++diff;
        }
        // simpan batas di query i
        // find lowest yg bs ditambahkan
        ++cnt[allow[diff]][idx1];
        ++cnt[allow[diff]][idx2];
        //cout << idx1 << " " << idx2 << " " << diff << endl;
        for(;idx2 + l <= n;) {
            // coba geser
            if(a[idx1 + l] != a[idx2 + l])
                ++diff;
            if(a[idx1] != a[idx2])
                --diff;
            ++idx1, ++idx2;
            ++cnt[allow[diff]][idx1];
            ++cnt[allow[diff]][idx2];
            //cout << idx1 << " " << idx2 << " " << diff << endl;
        }
    }
    for(int i = 1; i < que; ++i) {
        for(int j = 1; j <= n; ++j)
            cnt[i][j] += cnt[i - 1][j];
    }
    int ans[que][n + 1];
    for(int i = 0; i < que; ++i) {
        for(int j = 1; j <= n; ++j) {
            ans[q[i].se][j] = cnt[i][j];
        }
    }
    for(int i = 0; i < que; ++i) {
        for(int j = 1; j <= n - l + 1; ++j)
            cout << ans[i][j] << " ";
        cout << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...