Pagini recente » Cod sursa (job #1654553) | Solutii Autumn Warmup, Runda 3 | Cod sursa (job #1205943) | Cod sursa (job #2078294) | Cod sursa (job #2197072)
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <cstring>
#define CH (*s - 'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie
{
int cnt,nrfii;
Trie *fiu[26];
Trie()
{
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void ins( Trie *nod, char *s ) {
if( *s == '\n' ) {
nod->cnt ++; return;
}
if( nod->fiu[CH] == 0 ) {
nod->fiu[CH] = new Trie;
nod->nrfii ++;
}
ins( nod->fiu[ CH ], s+1 );
}
int del( Trie *nod, char *s ) {
if( *s == '\n' )
nod->cnt --;
else if( del( nod->fiu[ CH ], s+1 ) ) {
nod->fiu[ CH ] = 0;
nod->nrfii --;
}
if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
delete nod; return 1;
}
return 0;
}
int que( Trie *nod, char *s ) {
if( *s == '\n' )
return nod->cnt;
if( nod->fiu[ CH ] )
return que( nod->fiu[ CH ], s+1 );
return 0;
}
int pre( Trie *nod, char *s, int k ) {
if( *s == '\n' || nod->fiu[ CH ] == 0 )
return k;
return pre( nod->fiu[ CH ], s+1, k+1 );
}
int main()
{
char s[32];
while(f.getline(s,32))
{
s[strlen(s)]='\n';
switch(s[0])
{
case '0':ins(T,s+2);break;
case '1':del(T,s+2);break;
case '2':g<<que(T,s+2)<<endl;break;
case '3':g<<pre(T,s+2,0)<<endl;break;
}
}
return 0;
}