Cod sursa(job #2588079)

Utilizator Tudor06MusatTudor Tudor06 Data 24 martie 2020 13:49:18
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 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[NMAX];

int n = 1;

void add_string( const string& s ) {
    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( const string& s ) {
    int i = ROOT;
    for ( auto& it : s ) {
        i = trie[i].link[it];
        trie[i].prefix --;
    }
    trie[i].aparitii --;
}
int string_appearances( const string& s ) {
    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( const string& s ) {
    int i = ROOT;
    int j = 0, maxim;
    auto it = s.begin();
    do {
        i = trie[i].link[*it];
        j ++;
        it ++;
    } while ( it != s.end() && trie[i].prefix > 0 );
    return j - 1;
}
int main() {
    ifstream fin( "trie.in" );
    ofstream fout( "trie.out" );
    string s;
    int i, cer;
    while ( fin >> cer >> s ) {
        switch ( cer ) {
        case 0:
            add_string( s );
            break;
        case 1:
            delete_string( s );
            break;
        case 2:
            fout << string_appearances( s ) << endl;
            break;
        case 3:
            fout << longest_common_prefix( s ) << endl;
        }
    }
    return 0;
}