Pagini recente » Cod sursa (job #225015) | Cod sursa (job #1944782) | Cod sursa (job #1766012) | Cod sursa (job #2436462) | Cod sursa (job #1891677)
///FLAVIUS, UBESTE-MA
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define ch (s[0]-'a')
ifstream fin( "trie.in" );
ofstream fout("trie.out");
struct Trie
{
int val,suma;
Trie *v[26];
Trie()
{
val = 0;
suma = 0;
for( int i = 0 ; i < 26 ; i++ )
v[ i ] = 0;
}
};
Trie *T;
int x;
char s[30];
void adauga( Trie *T , char *s )
{
if( ch < 0 )
{
T -> val = T -> val + 1;
T -> suma = T -> suma + 1;
return;
}
if( T -> v[ ch ] == 0 )
T -> v[ ch ] = new Trie();
T -> suma = T -> suma - T -> v[ ch ] -> suma;
adauga( T -> v[ ch ] , s + 1 );
T -> suma = T -> suma + T -> v[ ch ] -> suma;
}
void sterge( Trie *T , char *s )
{
if( ch < 0 )
{
T -> val = T -> val - 1;
T -> suma = T -> suma - 1;
return;
}
T -> suma = T -> suma - T -> v[ ch ] -> suma;
sterge( T -> v[ ch ] , s + 1 );
T -> suma = T -> suma + T -> v[ ch ] -> suma;
if( T -> v[ ch ] -> suma == 0 )
{
delete T -> v[ ch ];
T -> v[ ch ] = 0;
}
}
int aparitii( Trie *T , char *s )
{
if( ch < 0 )
{
return T -> val;
}
if( T -> v[ ch ] == 0 )
return 0;
return aparitii( T -> v[ ch ] , s + 1 );
}
int suffix( Trie *T , char *s )
{
if( ch < 0 )
{
return 0;
}
if( T -> v[ ch ] == 0 || T -> suma == 0 )
return 0;
return suffix( T -> v[ ch ] , s + 1 ) + 1;
}
int main()
{
T = new Trie();
while( fin>>x )
{
fin.get();
fin.get( s , 25 );
if( x == 0 )
{
adauga( T , s );
}
else if( x == 1 )
{
sterge( T , s );
}
else if( x == 2 )
{
fout<<aparitii( T , s )<<'\n';
}
else
{
fout<<suffix( T , s )<<'\n';
}
}
return 0;
}