Cod sursa(job #2768648)

Utilizator DragosC1Dragos DragosC1 Data 11 august 2021 17:56:55
Problema Abc2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
 
string s, aux;
int v[50001], l;
int base;
int l2;
 
const int MOD = 1e9 + 7;

void read() {
    int i, j;
    int hash;
    ifstream f("abc2.in");
    f >> s;
    while (f >> aux) {
        hash = 0;
        for (j = 0; j < aux.size(); j++) 
            hash = (1LL * hash * 3 + (aux[j] - 'a')) % MOD;
        l2 = aux.size();
        v[++l] = hash;
    }
}
 
int nr;
 
void solve() {
    int i, st, dr, mij;
    sort(v + 1, v + l + 1);
    int hash = 0;
    base = 1;
    for (i = 0; i < l2; i++) {
        hash = (1LL * hash * 3 + (s[i] - 'a')) % MOD;
        if (i != 0)
            base = (1LL * base * 3) % MOD;
    }
    cout << base;
    st = 1, dr = l;
    while (st <= dr) {
        mij = (st + dr) / 2;
        if (v[mij] == hash) {
            nr++;
            break;
        }
        if (v[mij] < hash)
            st = mij + 1;
        else dr = mij - 1;
    }
    for (i = l2; i < s.size(); i++) {
        hash = (((1LL * hash - 1LL * (s[i - l2] - 'a') * base + MOD) * 3LL) % MOD + (s[i] - 'a')) % MOD;
        st = 1, dr = l;
        while (st <= dr) {
            mij = (st + dr) / 2;
            if (v[mij] == hash) {
                nr++;
                break;
            }
            else if (v[mij] < hash)
                st = mij + 1;
            else dr = mij - 1;
        }
    }
}
 
void output() {
    ofstream g("abc2.out");
    g << nr;
    g.close();
}
 
int main() {
    read();
    solve();
    output();
    return 0;
}