Pagini recente » Cod sursa (job #1124363) | Cod sursa (job #2539430) | Cod sursa (job #2351002) | Cod sursa (job #76209) | Cod sursa (job #2693311)
#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;
}