Cod sursa(job #2693311)

Utilizator Tudor06MusatTudor Tudor06 Data 5 ianuarie 2021 14:45:48
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 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[SIGMA * NMAX + 1];

int n = 1;

string s;

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