Pagini recente » Cod sursa (job #354391) | Cod sursa (job #98037) | Cod sursa (job #347371) | Cod sursa (job #300360) | Cod sursa (job #3175236)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Nod{
char lit;
int frcv, cuv_dupa;
int next[26];
};
int arb_size;
vector <Nod> arb;
void adaug( string s ){
int nod_curr = 0;
for( int i = 0; i < s.size(); i++ ){
arb[nod_curr].cuv_dupa++;
if( !arb[nod_curr].next[s[i]-'a'] ){
arb[nod_curr].next[s[i]-'a'] = ++arb_size;
nod_curr = arb[nod_curr].next[s[i]-'a'];
arb[nod_curr].lit = s[i];
}
else
nod_curr = arb[nod_curr].next[s[i]-'a'];
}
arb[nod_curr].cuv_dupa++;
arb[nod_curr].frcv++;
}
void sterg( string s ){
int nod_curr = 0;
for( int i = 0; i < s.size(); i++ ){
arb[nod_curr].cuv_dupa--;
nod_curr = arb[nod_curr].next[s[i]-'a'];
}
arb[nod_curr].cuv_dupa--;
arb[nod_curr].frcv--;
}
int queryCount( string s ){
int nod_curr = 0;
for( int i = 0; i < s.size(); i++ )
nod_curr = arb[nod_curr].next[s[i]-'a'];
return arb[nod_curr].frcv;
}
int queryPrefix( string s ){
int nod_curr = 0;
for( int i = 0; i < s.size(); i++ ){
if( !arb[nod_curr].cuv_dupa )
return i;
nod_curr = arb[nod_curr].next[s[i]-'a'];
}
return s.size();
}
int main()
{
int op;
string cuv;
while( in >> op >> cuv ){
if( op == 0 )
adaug(cuv);
else if( op == 1 )
sterg(cuv);
else if( op == 2 )
out << queryCount(cuv) << "\n";
else
out << queryPrefix(cuv) << "\n";
}
return 0;
}