Cod sursa(job #960756)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 11 iunie 2013 01:37:52
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb

#include <fstream>
using namespace std;

struct THashNode;
typedef THashNode *PHashNode;
struct THashNode
{
    long long Num;
    PHashNode Next;
};

PHashNode MakeHashNode(long long x,PHashNode Next)
{
    PHashNode r = new THashNode();
    r->Num = x;
    r->Next = Next;
    return r;
}

#define Hash_Prime 30031
//510511

PHashNode HashTable[Hash_Prime];

char Data[13000005];
long ReadPos;
long Len = 0;

long SearchDict(long long x)
{
    long long p = x % Hash_Prime;
    PHashNode HN = HashTable[p];
    while (HN != 0)
    {
        if (HN->Num == x)
        {
            return 1;
        }
        HN = HN->Next;
    }
    return 0;
}

void ReadInput(void)
{
    FILE *FIN = fopen("abc2.in","rt");
    fseek(FIN,0,SEEK_END);
    long SS = ftell(FIN);
    fseek(FIN,0,SEEK_SET);
    fread(Data,1,SS,FIN);
    fclose(FIN);
}

void ReadStrings(void)//fstream &fin)
{
    char *D = &Data[ReadPos];
    while (D[0] != 0)
    {
        long long z = 0;
        long long p;
        long a;

        for (a = 0;D[0] != '\n';a += 1)
        {
            z = (z * 3) + (D[0] - 'a');
            D += 1;
        }
        Len = a;
        D += 1;

        if (SearchDict(z) == 0)
        {
            p = z % Hash_Prime;
            HashTable[p] = MakeHashNode(z,HashTable[p]);
        }
    }
}

int main(void)
{
    //fstream fin("abc2.in",ios::in);
    fstream fout("abc2.out",ios::out);

    ReadInput();

    while (Data[ReadPos] != '\n')
    {
        ReadPos += 1;
    }
    Data[ReadPos] = 0;
    ReadPos += 1;

//    fin >> Data;

    ReadStrings();//fin);

    long Count = 0;

    long long Val = 0;
    long long Mod = 1;
    for (long a = 0;a < Len - 1;a += 1)
    {
        Val = (Val * 3) + (Data[a] - 'a');
        Mod *= 3;
    }    

    for (long a = Len - 1;Data[a] != 0;a += 1)
    {
        Val = ((Val % Mod) * 3) + (Data[a] - 'a');
        Count += SearchDict(Val);
    }

    fout << Count;

    //fin.close();
    fout.close();
    return 0;
}