Pagini recente » Cod sursa (job #1083769) | Cod sursa (job #2827731) | Cod sursa (job #352565) | Cod sursa (job #1934240)
/*
//Varianta neeficienta
#include <cstdio>
#include <cstring>
#define CH (*s - 'a')
using namespace std;
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 line[ 32 ];
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
fgets( line, 32, stdin );
while( !feof( stdin ) ) {
switch( line[0] ) {
case '0': ins( T, line+2 ); break;
case '1': del( T, line+2 ); break;
case '2': printf( "%d\n", que( T, line+2 ) ); break;
case '3': printf( "%d\n", pre( T, line+2, 0 ) ); break;
}
fgets( line, 32, stdin );
}
return 0;
}
*/
//Sursa de 100 de puncte
#include <iostream>
#include<fstream>
#include<cstring>
#define CH (*s - 'a')
using namespace std;
struct nod
{
int info,nrfii;
nod *fii[26];
} *rad;
int t;
char s[22];
ifstream f("trie.in");
ofstream g("trie.out");
void adauga(char s[22],nod *r)
{
if(!s[0])
{
r->info++;
return ;
}
if(!r->fii[s[0]-'a']) {
nod* q=new nod;
q->info=0;
q->nrfii=0;
r->fii[s[0]-'a']=q;
r->nrfii++;
}
adauga(s + 1, r->fii[s[0]-'a']);
}
int sterge(char s[22],nod *r)
{
if(!s[0]) r->info--;
else if(r->fii[s[0]-'a'])if(sterge(s+1,r->fii[s[0]-'a']))
{
r->fii[s[0]-'a']=0;
r->nrfii--;
}
if(!r->info && !r->nrfii && r!=rad && r != 0)
{
delete r;
return 1;
}
return 0;
}
void aparitii(char s[22],nod*r)
{
int l=strlen(s);
for(int i=0; i<l && r != 0; i++)
r=r->fii[s[i]-'a'];
if(r==0)
g<<"0\n";
else
g<<r->info<<'\n';
}
void prefix(char s[22], nod* r)
{
int l=strlen(s),i;
for(i=0; i<l; i++)
if(r->fii[s[i]-'a'])
r=r->fii[s[i]-'a'];
else break;
g<<i<<'\n';
}
int main()
{
rad=new nod;
rad->info=0;
rad->nrfii=0;
while(f>>t)
{
f>>s;
if(t==0) adauga(s, rad);
else if(t==1) sterge(s,rad);
else if(t==2) aparitii(s,rad);
else prefix(s,rad);
}
return 0;
}