Cod sursa(job #1910824)

Utilizator raulmuresanRaul Muresan raulmuresan Data 7 martie 2017 18:29:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include<fstream>
#include<vector>
#include<string>
#define modulo 666013

using namespace std;

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

struct Node
{
    int finish, prefix;
    Node *urm[26];

    Node()
    {
        //fout << "ajunge"<<"\n";
        finish = prefix = 0;
        for(int i = 0; i < 26; i++)
        {
            urm[i] = NULL;
        }

    }
};


void adauga(Node *node, int pos, string &sir)
{
    //fout << pos <<"\n";
    if(pos == sir.length())
    {
        node -> finish++;
        return;
    }
    int letter = sir[pos] - 'a';
    if(node -> urm[letter] == NULL)
    {
        node -> urm[letter] = new Node();
    }
    node -> urm[letter] -> prefix++;
    adauga(node -> urm[letter], pos + 1, sir);
}
void sterge(Node *node, int pos, string &sir)
{
    if (pos == sir.size()) {
        node -> finish--;
        return;
    }

    int letter = sir[pos] - 'a';
    node -> urm[letter] -> prefix--;
    sterge(node -> urm[letter], pos + 1, sir);
    if(node -> urm[letter] -> prefix == 0)
    {
        node -> urm[letter] = NULL;
        //vreau sa sterg nodul
    }
}

int cauta(Node *node, int pos, string &sir)
{
    if(pos == sir.length())
    {
        return node->finish;
    }
    int letter = sir[pos] - 'a';
    if(node -> urm[letter] == NULL)
    {
        return 0;
    }
    return cauta(node -> urm[letter], pos + 1, sir);
}


int prefix(Node *node, int pos, string &sir)
{
    if(pos == sir.length())
    {
        return sir.size();
    }
    int letter = sir[pos] - 'a';
    if(node -> urm[letter] == NULL)
    {
        return pos;
    }
    return prefix(node -> urm[letter], pos + 1, sir);
}


string sir;
int i, n, k, j,contor,st,dr,sol,x,y;

int main()
{
    Node *root = new Node();
    while(fin >> x >> sir)
    {
        //fout << sir << "\n";
        if(x == 0)
        {
            adauga(root, 0, sir);
        }
        if(x == 1)
        {
            sterge(root, 0, sir);
        }
        if(x == 2)
        {
            fout << cauta(root, 0, sir) << "\n";
        }
        if(x == 3)
        {
            fout << prefix(root, 0, sir) << "\n";
        }
    }


}