Pagini recente » Cod sursa (job #61707) | Cod sursa (job #2339000) | Cod sursa (job #370383) | Cod sursa (job #2836572) | Cod sursa (job #1059443)
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef struct nod
{
char i;
unsigned short nr;
nod * fiu[26];
nod()
{
i=0;nr=0;
memset(fiu,0,sizeof(fiu));
}
} nod;
nod *nd=new nod;
void ins(nod *n, char *s)
{
if(*s=='\0')
{
n->nr++;
return;
}
if(n->fiu[*s-'a']==0)
{
n->fiu[*s-'a']=new nod;
n->i++;
}
ins(n->fiu[*s-'a'],s+1);
}
int del(nod *n,char *s)
{
if(*s=='\0')
n->nr--;
else if(del(n->fiu[ *s-'a' ], s+1))
{
n->fiu[*s-'a']=0;
n->i--;
}
if(n->nr==0&&n->i==0&&n!=nd)
{
delete n;
return 1;
}
return 0;
}
int nr(nod *n,char *s)
{
if(*s=='\0')
{
return n->nr;
}
if(n->fiu[*s-'a'])
return nr(n->fiu[*s-'a'],s+1);
return 0;
}
int pre( nod *n, char *s, int k ) {
if( *s == '\0' || n->fiu[ *s-'a' ] == 0 )
return k;
return pre( n->fiu[ *s-'a' ], s+1, k+1 );
}
char l[30];
int a;
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
while(!f.eof())
{
f>>a>>l;
switch(a)
{
case 0: ins(nd,l); break;
case 1: del(nd,l);break;
case 2: g<<nr(nd,l)<<'\n'; break;
case 3: g<<pre(nd,l,0)<<'\n'; break;
}
}
return 0;
}