Pagini recente » Cod sursa (job #3123084) | Cod sursa (job #2812425) | Cod sursa (job #1241028) | Cod sursa (job #2285691) | Cod sursa (job #2588079)
#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;
}