Pagini recente » Cod sursa (job #147240) | Cod sursa (job #2598280) | Cod sursa (job #801476) | Cod sursa (job #3227077) | Cod sursa (job #1131038)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#define NMAX 27
#define Trans(i) cuv[i] -'a'
using namespace std;
struct Trie
{
int nr_Sons , nr_W;
Trie *Son[NMAX];
Trie()
{
memset ( Son , 0 , sizeof( Son ) );
nr_Sons = nr_W = 0 ;
}
}*G;
ifstream in ( "trie.in" );
ofstream out ( "trie.out" );
char cuv[NMAX];
void AddWord ( void )
{
int i , j ;
Trie *p = G;
while ( cuv[i] and p->Son[Trans(i)] )
p = p->Son[Trans(i++)];
if ( !cuv[i] )
{
p->nr_W++;
return ;
}
for( ; cuv[i] ; )
{
p->nr_Sons++;
p->Son[Trans(i)] = new Trie;
p = p->Son[Trans(i)] ;
++i;
}
p->nr_W++;
}
void PutWord ( void )
{
int i = 0 ;
Trie *p= G;
while ( cuv[i] and p->Son[Trans(i)])
p = p->Son[Trans(i++)];
if ( !cuv[i] )
out << p->nr_W << "\n";
else out << "0\n";
}
bool ok = false;
void PutPref ( void )
{
int i=0;
Trie *p=G;
while(cuv[i] && p->Son[Trans(i)])
p=p->Son[Trans(i++)];
out << i << "\n";
}
void EraseWord ( int i , Trie *p)
{
if ( cuv[i] )
EraseWord ( i + 1 , p->Son[Trans(i)] );
else
{
if ( !cuv[i] ) p->nr_W--;
if ( ok = true )
{
p->nr_W--;
p->nr_Sons = 0 ;
p->Son[Trans(i)] = 0;
ok = false;
}
}
if ( !p->nr_W and !p->nr_Sons and p!=G )
{
delete p ;
ok = true ;
}
}
int main ( void )
{
int i , j , type;
for ( ; in >> type >> cuv ; )
{
if ( type == 0 ) AddWord();
if ( type == 1 ) EraseWord( 0 , G );
if ( type == 2 ) PutWord();
if ( type == 3 ) PutPref();
}
in.close();
out.close();
return 0 ;
}