Cod sursa(job #2249648)

Utilizator NashikAndrei Feodorov Nashik Data 30 septembrie 2018 09:49:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <cstring>
#include <iostream>
#include <string>
 
using namespace std;
 
ifstream fin ("trie.in");
ofstream fout ("trie.out");
 
const int CHAR = 30;
 
struct Trie{
     
    int val;
    int cuv;
    Trie *next[CHAR];
};
 
Trie *T;
Trie *nod;
 
int n;
//char S[CHAR];
string S;
void Add();
void Del();
void Query();
void QueryP();
 
int main() {
     
    int q;
    T = new Trie;
    char x;
    while ( fin >> q) {
        //memset(S,0,sizeof(S));
        fin >> S;
        n = S.size();
        if ( q == 0) 
            Add();
        else
            if ( q == 1)
                Del();
        else
            if ( q == 2)
                Query();
        else
            QueryP();
    }
}   
 
void Add() {
         
    nod = T;
    for ( int i = 0; i < n; ++i) {
            if ( nod -> next[S[i] - 'a'] == nullptr )
                nod -> next[S[i] - 'a'] = new Trie;  
                nod = nod -> next[S[i] - 'a'];
                nod -> val++;
            if ( i == n - 1)
                nod -> cuv++;
            }
     
} 
 
void Del() {
     
    Trie *cop;
    nod = T;
    for ( int i = 0; i < n; ++i) {
        cop = nod;
        nod = nod->next[S[i]-'a'];
        nod ->val --;
        if ( nod->val == 0) {
            cop -> next[S[i] -'a'] = nullptr;
            break;
        }
        if ( i == n - 1)
            nod ->cuv--;
        }
         
}
 
void Query() {
    nod = T;
    for ( int i = 0; i < n; ++i) {
        nod  = nod->next[S[i] -'a'];
        if ( nod == nullptr)
            break;
    }
    if ( nod == nullptr)
        fout << 0 << "\n";
    else
        fout << nod ->cuv << "\n";
}
 
void QueryP() {
    nod = T;
    int i = 0;
    while ( nod != nullptr and i <= n){
        nod = nod->next[S[i]-'a'];
        ++i;
    }
    fout << i - 1 << "\n"; 
}