Cod sursa(job #1865617)

Utilizator Coroian_DavidCoroian David Coroian_David Data 1 februarie 2017 21:15:12
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>

#include <cstring>

using namespace std;

FILE *f, *g;

int lst[10500001];
int val[500001];
int urm[500001];
int nr;

int HASH = (1 << 20) - 1;

char anticText[10000010];

char dict[100];

int h(int x)
{
    return (x & HASH);
}

void add(int a, int b)
{
    int p = lst[a];

    while(p != 0)
    {
        if(val[p] == b)
            return;

        p = urm[p];
    }


    val[++ nr] = b;

    urm[nr] = lst[a];

    lst[a] = nr;
}

bool caut(int a, int b)
{
    int p = lst[a];

    while(p != 0)
    {
        if(val[p] == b)
            return 1;

        p = urm[p];
    }

    return 0;
}

int n;

void addDict()
{
    int i;
    int len = strlen(dict) - 1;
    int nr = 0;

    //printf("*%s", dict);

   // printf("%d\n", n);

    if(n == 0)
        n = len;

    if(len != n)
        return;

    for(i = 0; i < len; i ++)
    {
        nr = nr * 3 + dict[i] - 'a';
    }

    //printf("%d\n", nr);

    add(h(nr), nr);
}

void readFile()
{
    f = fopen("abc2.in", "r");

    fgets(anticText, 10000009, f);

    while(fgets(dict, 30, f) != 0)
    {
        addDict();
    }

    fclose(f);
}

int putere(int a, int b)
{
    int rez = 1, ca = a;
    int i;

    for(i = 0; (1 << i) <= b; i ++)
    {
        if(((1 << i) & b) != 0)
        {
            rez *= ca;
        }

        ca *= ca;
    }

    return rez;
}

int rez;

void solve()
{
    int MODL = putere(3, n - 1);

    int i;
    int l = strlen(anticText) - 1;
    int nr = 0;

    for(i = 0; i < l; i ++)
    {
        if(i < n)
        {
            nr = nr * 3 + anticText[i] - 'a';
        }

        else
        {
            rez += caut(h(nr), nr);

           // printf("*%d\n", nr);

            nr = nr % MODL;
            //printf("%d\n", nr);

            nr = nr * 3 + anticText[i] - 'a';
        }
    }

    rez += caut(h(nr), nr);
}
/*
bca = 9 + 6 = 15
15 % 9 = 6
6 * 3 + 2
cac =
*/

void printFile()
{
    g = fopen("abc2.out", "w");

    fprintf(g, "%d\n", rez);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}