Pagini recente » Cod sursa (job #633888) | Cod sursa (job #725834) | Cod sursa (job #2087357) | Cod sursa (job #286909) | Cod sursa (job #2588170)
#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;
}