Submission #966916

#TimeUsernameProblemLanguageResultExecution timeMemory
966916Charizard2021Lottery (CEOI18_lot)C++17
25 / 100
32 ms1116 KiB
#include<bits/stdc++.h>
using namespace std;
const int p = 1e9 + 7;
const int MOD = 1e9 + 21;
const int MODInverse = 928571448;
int main(){
    int n, l;
    cin >> n >> l;
    int powers[1 + n];
    powers[0] = 1;
    int invPowers[1 + n];
    invPowers[0] = 1;
    for(int i = 1; i <= n; i++){
        powers[i] = (long long)powers[i - 1] * p % MOD;
        invPowers[i] = (long long)invPowers[i - 1] * MODInverse % MOD;
    }
    vector<int> a(1 + n);
    vector<long long> hashing(1 + n, 0);
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        hashing[i] = (hashing[i - 1] + powers[i] * a[i]) % MOD;
    }
    int q;
    cin >> q;
    if(n <= 300){
        while(q--){
            int val;
            cin >> val;
            vector<int> ans(1 + n, 0);
            for(int i = 1; i + l - 1 <= n; i++){
                for(int j = i + 1; j + l - 1 <= n; j++){
                    int thing = 0;
                    for(int k = 0; k < l; k++){
                        if(a[i + k] != a[j + k]){
                            thing++;
                        }
                    }
                    if(thing <= val){
                        ans[i]++;
                        ans[j]++;
                    }
                }
            }
            for(int i = 1; i + l - 1 <= n; i++){
                cout << ans[i] << " ";
            }
            cout << "\n";
        }
    }
    else if(q == 1){
        int k;
        cin >> k;
        if(k == 0){
            map<long long, int> freq;
            for(int i = 1; i + l - 1 <= n; i++){
                long long num = hashing[i + l - 1] - hashing[i - 1];
                num %= MOD;
                num = (num * invPowers[i]) % MOD;
                if(num < 0){
                    num += MOD;
                }
                freq[num]++;
            }
            for(int i = 1; i + l - 1 <= n; i++){
                long long num = hashing[i + l - 1] - hashing[i - 1];
                num %= MOD;
                num = (num * invPowers[i]) % MOD;
                if(num < 0){
                    num += MOD;
                }
                cout << freq[num] - 1 << " ";
            }
            cout << "\n";
        }
    }
}
#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...