Cod sursa(job #2588170)

Utilizator Tudor06MusatTudor Tudor06 Data 24 martie 2020 15:33:48
Problema Trie Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>

using namespace std;

const int SIGMA = 26;
const int NMAX = 1e5;
const int ROOT = 0;

struct node {
    int link[SIGMA];
    int aparitii;
    int prefix;
} trie[20 * NMAX + 1];

int n = 1;
string s;

void add_string() {
    int i = ROOT;
    for ( auto& it : s ) {
        if ( trie[i].link[it] == 0 ) {
            trie[i].link[it] = n;
            n ++;
        }
        i = trie[i].link[it];
        trie[i].prefix ++;
    }
    trie[i].aparitii ++;
}
void delete_string() {
    int i = ROOT;
    for ( auto& it : s ) {
        i = trie[i].link[it];
        trie[i].prefix --;
    }
    trie[i].aparitii --;
}
int string_appearances() {
    int i = ROOT;
    auto it = s.begin();
    while ( it != s.end() && trie[i].link[*it] != 0 ) {
        i = trie[i].link[*it];
        it ++;
    }
    if ( it == s.end() )
        return trie[i].aparitii;
    return 0;
}
int longest_common_prefix() {
    int i = ROOT;
    auto it = s.begin();
    while ( it != s.end() && trie[trie[i].link[*it]].prefix > 0 ) {
        i = trie[i].link[*it];
        it ++;
    }
    return ( it - s.begin() );
}
int main() {
    ifstream fin( "trie.in" );
    ofstream fout( "trie.out" );
    int cer;
    while ( fin >> cer >> s ) {
        for ( auto& it : s )
            it -= 'a';
        switch ( cer ) {
        case 0:
            add_string();
            break;
        case 1:
            delete_string();
            break;
        case 2:
            fout << string_appearances() << endl;
            break;
        case 3:
            fout << longest_common_prefix() << endl;
            break;
        }
    }
    cout << n << endl;
    return 0;
}