Pagini recente » Cod sursa (job #122770) | Cod sursa (job #2930071) | Cod sursa (job #1183002) | Cod sursa (job #2469707) | Cod sursa (job #2258670)
#include <bits/stdc++.h>
#define maxl 20
#define sgm 26
using namespace std;
typedef struct
{
int val, mask, next[sgm], prev;
}trie;
char v[maxl+5];
vector <trie> arb;
vector <int> qu;
int lo, hi;
int get_adr ()
{
int adr;
if ( lo < hi )
adr = qu[lo++];
else
{
arb.push_back ( trie() );
adr = arb.size () - 1;
}
arb[adr].mask = arb[adr].val = arb[adr].prev = 0;
for ( int i = 0; i < sgm; i++ )
arb[adr].next[i] = 0;
return adr;
}
void del_adr ( int adr )
{
qu.push_back ( adr );
hi++;
}
void add_cuv ( int sl )
{
int i = 0, cur = 0, adr;
while ( i < sl && (arb[cur].mask & (1<<v[i])) > 0 )
{
cur = arb[cur].next[v[i]];
i++;
}
for ( ; i < sl; i++ )
{
arb[cur].mask += (1<<v[i]);
adr = get_adr ();
arb[cur].next[v[i]] = adr;
arb[adr].prev = cur;
cur = adr;
}
arb[cur].val++;
}
void del_cuv ( int sl )
{
int i = 0, cur = 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_adr ( cur );
cur = arb[cur].prev;
i = sl - 1;
while ( i >= 0 && arb[cur].val == 0 && arb[cur].mask == (1<<v[i]) )
{
del_adr ( cur );
cur = arb[cur].prev;
i--;
}
i = max ( i, 0 );
arb[cur].mask -= ( 1 << v[i] );
}
}
int search_cuv ( int pin, int sl )
{
int i = 0, cur = 0;
while ( i < sl && (arb[cur].mask & (1<<v[i])) > 0 )
{
cur = arb[cur].next[v[i]];
i++;
}
if ( pin == 0 )
{
if ( i < sl )
return 0;
return arb[cur].val;
}
return i;
}
int main ()
{
ifstream fin ( "trie.in" );
ofstream fout ( "trie.out" );
int op, i, sl;
int adr = get_adr ();
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
fout << search_cuv ( op - 2, sl ) << '\n';
fin >> op >> v;
}
fin.close ();
fout.close ();
return 0;
}