Cod sursa(job #1832390)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 19 decembrie 2016 21:57:33
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#include <string.h>
#define MAXT 10000009
#define MAXC 25
#define MOD 200003
using namespace std;
char sir[MAXT];

vector<long long> v[MOD];

int cautare(int h){

    int i, n, q;
    n = v[h % MOD].size();
    q = h % MOD;

    for(i = 0;i < n; ++i)
        if(v[q][i] == h)
            return 1;

    return 0;
}

int main(){

    int len, a[25], h, l, total = 0, i;
    char cuv[MAXC];
    fstream f("abc2.in",ios::in);
    fstream g("abc2.out",ios::out);

    f.getline(sir,MAXT,'\n');
    f.getline(cuv,MAXC,'\n');
    len = strlen(cuv);
    l = strlen(sir);

    a[0] = 1;
    for(i = 1;i <= len; ++i)
        a[i] = 3 * a[i - 1];

    h = 0;
    for(i = 0;i < len; ++i)
        h = h + a[i] * (cuv[i] - 'a');

    if(cautare(h) == 0)
        v[h % MOD].push_back(h);

    while(f.getline(cuv,MAXC,'\n')){
        h = 0;
        for(i = 0;i < len; ++i)
            h = h + a[i] * (cuv[i] - 'a');

        if(cautare(h) == 0)
            v[h % MOD].push_back(h);
    }

    h = 0;
    for(i = 0;i < len; ++i)
        h = h + a[i] * (sir[i] - 'a');

    if(cautare(h) == 1)
        ++total;

    for(i = len;i < l; ++i){
        h = h - (sir[i - len] - 'a');
        h = h / 3;
        h = h + (sir[i] - 'a') * a[len - 1];
       if(cautare(h) == 1)
            ++total;
    }

    g << total;
}