Cod sursa(job #3232186)

Utilizator Razvan23Razvan Mosanu Razvan23 Data 29 mai 2024 10:47:32
Problema Trie Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.5 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");
///hashuri
///preordine

class Hash
{
public:
    int n;
    list<int> *H;
    list<string> *Hs;
    list<string> *Prefix;
    Hash(int n)
    {
        this->n = n;
        H = new list<int>[n+5];
        Hs = new list<string>[n+5];
        Prefix = new list<string>[n+5];
    }
    ~Hash()
    {
        delete []H;
        delete []Hs;
        delete []Prefix;
    }
    int Modulo(int x)
    {
        return x % n;
    }
    int Modulo_String(string x)
    {
        int i;
        long long p, nr;
        nr = 0;
        p = 1;
        for(i=0; x[i]!=0; i++)
        {
            nr = (nr + (x[i] - 'a' + 1) * p) % n;
            p = (p * 64) % n;
        }
        return nr;
    }
    void Insert(int x)
    {
        int index = Modulo(x);
        H[index].push_back(x);
    }
    void Insert_String(string x)
    {
        int index = Modulo_String(x);
        Hs[index].push_back(x);
    }
    void Delete(int x)
    {
        int index = Modulo(x);
        list <int> :: iterator it;
        for (it = H[index].begin(); it != H[index].end() && *it != x; it++)
            ;
        if(it != H[index].end()) H[index].erase(it);
    }
    void Delete_String(string x)
    {
        int index = Modulo_String(x);
        list <string> :: iterator it;
        for (it = Hs[index].begin(); it != Hs[index].end() && *it != x; it++)
            ;
        if(it != Hs[index].end()) Hs[index].erase(it);
    }
    void Delete_Prefix(string x)
    {
        list <string> :: iterator it;
        int i;
        long long p, nr;
        nr = 0;
        p = 1;
        for(i=0; x[i]!=0; i++)
        {
            nr = (nr + (x[i] - 'a' + 1) * p) % n;
            p = (p * 64) % n;
            for (it = Prefix[nr].begin(); it != Prefix[nr].end() && *it != x; it++)
                ;
            if(it != Prefix[nr].end()) Prefix[nr].erase(it);
        }
    }
    void Afisare()
    {
        int i;
        for (i = 0; i < n; i++)
        {
            for (auto w : H[i])
                fout << w << " ";
            fout << "\n";
        }
    }
    void Afisare_String()
    {
        int i;
        for (i = 0; i < n; i++)
        {
            for (auto w : Hs[i])
                fout << w << " ";
            fout << "\n";
        }
    }
    bool Find(int x)
    {
        int index = Modulo(x);
        list<int>::iterator it;
        for (it = H[index].begin(); it != H[index].end(); it++)
            if (*it == x) return true;
        return false;
    }
    int Find_All_Strings(string x)
    {
        int index = Modulo_String(x);
        list<string>::iterator it;
        int nr = 0;
        for (it = Hs[index].begin(); it != Hs[index].end(); it++)
            if (*it == x) nr++;
        return nr;
    }
    bool Find_String(string x)
    {
        int index = Modulo_String(x);
        list<string>::iterator it;
        for (it = Hs[index].begin(); it != Hs[index].end(); it++)
            if (*it == x) return true;
        return false;
    }
    bool Find_Prefix(string x)
    {
        int index = Modulo_String(x);
        list<string>::iterator it;
        for (it = Prefix[index].begin(); it != Prefix[index].end(); it++)
            if (*it == x) return true;
        return false;
    }
    void Add_Prefix(string x)
    {
        int i;
        long long p, nr;
        nr = 0;
        p = 1;
        for(i=0; x[i]!=0; i++)
        {
            nr = (nr + (x[i] - 'a' + 1) * p) % n;
            p = (p * 64) % n;
            Prefix[nr].push_back(x.substr(0, i+1));
        }
    }
    void Task3(string x)
    {
        int i, lg;
        long long p, nr;
        nr = lg = 0;
        p = 1;
        for(i=0; x[i]!=0; i++)
        {
            nr = (nr + (x[i] - 'a' + 1) * p) % n;
            p = (p * 64) % n;
            string s = x.substr(0, i + 1);
            if(Find_Prefix(s) == true) lg = i + 1;
        }
        fout << lg << "\n";
    }
};

int main()
{
    int op;
    Hash A(1234577);
    string s;
    while(fin >> op)
    {
        fin >> s;
        if(op == 0)
        {
            A.Insert_String(s);
            A.Add_Prefix(s);
        }
        else if(op == 1)
        {
            A.Delete_String(s);
            A.Delete_Prefix(s);
        }
        else if(op == 2) fout << A.Find_All_Strings(s) << "\n";
        else A.Task3(s);
    }
    return 0;
}