Pagini recente » Cod sursa (job #69027) | Cod sursa (job #1968315) | Cod sursa (job #185347) | Cod sursa (job #10627) | Cod sursa (job #2255069)
#include <bits/stdc++.h>
#define maxl 20
using namespace std;
typedef struct
{
int val, mask, next[26], prev;
}trie;
char v[maxl+5];
vector <trie> arb;
vector <int> qu; /// queue cu elemente sterse
int lo, hi;
int get_new_adr ()
{
int adr;
if ( lo < hi )
{
adr = qu[lo];
lo++;
}
else
{
adr = arb.size ();
arb.push_back ( trie() );
}
arb[adr].mask = arb[adr].prev = arb[adr].val = 0;
for ( int i = 0; i < 26; i++ )
arb[adr].next[i] = 0;
return adr;
}
void del_nod ( int adr )
{
qu.push_back ( adr );
hi++;
}
void add_cuv ( int sl )
{
int cur = 0, i = 0;
i = 0;
while ( i < sl && (arb[cur].mask & (1<<v[i])) > 0 )
{
cur = arb[cur].next[v[i]];
i++;
}
if ( i == sl )
{
arb[cur].val++;
return;
}
int adr;
for ( ; i < sl; i++ )
{
arb[cur].mask += (1<<v[i]);
adr = get_new_adr ();
arb[cur].next[v[i]] = adr;
arb[adr].prev = cur;
cur = adr;
}
arb[cur].val++;
}
void del_cuv ( int sl )
{
int cur = 0, i = 0;
for ( i = 0; i < sl; i++ )
cur = arb[cur].next[v[i]];
arb[cur].val--;
if ( arb[cur].val == 0 && arb[cur].mask == 0 )
{
del_nod ( cur );
cur = arb[cur].prev;
i = sl - 1;
while ( i >= 0 && cur != 0 && arb[cur].mask == (1<<v[i]) && arb[cur].val == 0 )
{
del_nod ( cur );
i--;
cur = arb[cur].prev;
}
i = max ( i, 0 );
arb[cur].mask -= (1<<v[i]);
}
}
int num_cuv ( int pin, int sl )
{
int cur = 0, i = 0;
while ( i < sl && (arb[cur].mask & (1<<v[i])) > 0 )
{
cur = arb[cur].next[v[i]];
i++;
}
int rez = 0;
if ( pin == 0 )
{
if ( i == sl )
rez = arb[cur].val;
return rez;
}
return i;
}
int main ()
{
int op, sl, i;
ifstream fin ( "trie.in" );
ofstream fout ( "trie.out" );
arb.push_back ( trie() );
fin >> op >> v;
while ( !fin.eof () )
{
sl = strlen ( v );
for ( i = 0; i < sl; i++ )
v[i] -= 'a';
if ( op == 0 )
add_cuv ( sl );
else if ( op == 1 )
del_cuv ( sl );
else if ( op == 2 )
fout << num_cuv ( 0, sl ) << '\n';
else
fout << num_cuv ( 1, sl ) << '\n';
fin >> op >> v;
}
fin.close ();
fout.close ();
return 0;
}