Cod sursa(job #1368422)

Utilizator japjappedulapPotra Vlad japjappedulap Data 2 martie 2015 17:10:28
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

ifstream is ("abc2.in");
ofstream os ("abc2.out");

const int MOD = 666013;

char Main[10000001], C[22];
int N, Sol, MainSize;
int P3[21], X;

vector <pair<int, int>> Hash[MOD];

void Insert(int value);
int Find(int value);

int main()
{
    is >> Main;
    is >> C;
    N = strlen(C);
    MainSize = strlen(Main);
    P3[0] = 1;
    for (int i = 1; i <= N; ++i)
        P3[i] = P3[i-1] * 3;
    for (int i = 0; i < N; ++i)
        X += (P3[i]) * (Main[i] - 'a');
    Insert(X);

    for (int i = N; i < MainSize; ++i)
    {
        X /= 3;
        X += P3[N-1] * (Main[i] - 'a');
        Insert(X);
    }
    X = 0;
    for (int i = 0; i < N; ++i)
        X += (P3[i]) * (C[i] - 'a');
    Sol += Find(X);
    while (is >> C)
    {
        X = 0;
        for (int i = 0; i < N; ++i)
            X += (P3[i]) * (C[i] - 'a');
        Sol += Find(X);
    }

    os << Sol;
    is.close();
    os.close();
}

int Find(int value)
{
    int R = value % MOD;
    int aux;
    for (auto it = Hash[R].begin(); it != Hash[R].end(); ++it)
        if ( (*it).first == value)
        {
            aux = (*it).second;
            Hash[R].erase(it);
            return aux;
        }
    return 0;
};

void Insert(int value)
{
    int R = value % MOD;
    for (auto& it : Hash[R])
        if (it.first == value)
        {
            it.second++;
            return;
        }
    Hash[R].push_back({value, 1});
};




















/*

bbcabbabcba
11201101210

*/