Cod sursa(job #3216948)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 20 martie 2024 16:29:30
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct nod
{
    int cnt = 0,cntflag = 0 ;
    int next[28];
    bool flag = false ;

    nod()
    {
        fill(begin(next), end(next), -1);
    }
};
vector<nod> trie;
void add (string s, vector<nod> &trie)
{
    int start = 0;
    for ( int i = 0 ; i < s.size() ; i ++ )
    {
        int val = s[i] - 'a';

        if ( trie[start].next[val] == -1)
        {
            trie[start].next[val] = trie.size();
            trie.emplace_back();
        }

        start = trie[start].next[val];
        trie[start].cnt ++ ;
    }

    trie[start].flag = true;
    trie[start].cntflag ++ ;

}

int cauta ( string s, vector<nod> &trie )
{
    int start = 0 ;
    int cnt = 1e9 ;
    for (int i = 0 ; i < s.size() ; i ++ )
    {
        int val = s[i] - 'a';
        if ( trie[start].next[val] == -1 || trie[trie[start].next[val]].cnt == 0  )
        {
            cnt = 0  ;
            break ;
        }
        start = trie[start].next[val];
    }

    if ( cnt == 0 )
        return 0 ;

    return trie[start].cntflag;
}

void sterg (string s, vector<nod> &trie )
{
    int start =0 ;

    for ( int i = 0 ; i < s.size() ; i ++ )
    {
        int val = s[i] - 'a';
        start = trie[start].next[val];
        trie[start].cnt -- ;
    }

    trie[start].cntflag -- ;
}

int prefix(string s, vector<nod> &trie)
{
    int start = 0 ;
    int cnt = 0 ;

    for ( int i = 0 ; i < s.size() ; i ++ )
    {
        int val = s[i] - 'a';
        if ( trie[start].next[val] == -1 || trie[trie[start].next[val]].cnt == 0  )
            break ;
        cnt ++;
        start = trie[start].next[val];
    }
    return cnt ;
}
int main()
{
    trie.emplace_back();

    int tip ;
    while ( cin >> tip )
    {
        string x;
        cin >> x;
        if ( tip == 0 )
        {
            add(x,trie);
        }
        if ( tip == 1 )
            sterg(x,trie);
        if ( tip == 2)
        {
            cout << cauta (x,trie) << '\n';
        }

        if ( tip == 3 )
        {
            cout <<  prefix(x,trie) << '\n';

        }

    }
    return 0;
}