Cod sursa(job #3266663)

Utilizator Barbu_MateiBarbu Matei Barbu_Matei Data 9 ianuarie 2025 19:34:33
Problema Abc2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

const int p = 4, MOD = 66013;
string text, word;
vector<long long> m[MOD];

bool searchHash(long long k) {
    int r = k % MOD;
    for (int i = 0; i < m[r].size(); ++i) {
        if (m[r][i] == k) {
            return 1;
        }
    }
    return 0;
}

void insertHash(long long k) {
    int r = k % MOD;
    if (!searchHash(k)) {
         m[r].push_back(k);
    }
}

long long hashF(string word) {
    long long res = 0;
    for (int i = 0; i < word.size(); ++i) {
        res = res * p + (word[i] - 'a');
    }
    return res;
}

long long calcPow(int base, int power) {
    long long res = 1;
    for (int i = 1; i <= power; ++i) {
        res *= base;
    }
    return res;
}

int main() {
    ifstream cin("abc2.in");
    ofstream cout("abc2.out");
    cin >> text;
    while (cin >> word) {
        insertHash(hashF(word));
    }
    int wSize = word.size();
    long long res = 0, pos = 0, ans = 0;
    long long last = calcPow(p, wSize - 1);
    for (int i = 0; i < text.size(); ++i) {
        res = res * p + (text[i] - 'a');
        if (i >= wSize - 1) {
            if (searchHash(res)) {
                ++ans;
            }
            res = res - last * (text[i - (wSize - 1)] - 'a');
        }
    }
    cout << ans;
}