Pagini recente » Cod sursa (job #878110) | Cod sursa (job #1401358) | Cod sursa (job #3201735) | Cod sursa (job #2892170) | Cod sursa (job #1058003)
//nu ii frumos sa te uiti pe sursele altora:))...hotule....nu o sti face singur?:))
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define sigma 30
#define el *s-'a'
ifstream fin("trie.in");
ofstream fout("trie.out");
int i;
struct Trie{
int cnt, nr_fii;
Trie* fii[sigma];
Trie(){
cnt=0;
nr_fii=0;
for(i=0;i<sigma;i++)
fii[i]=0;
}
};
Trie *t=new Trie;
void ins(Trie* nod, char* s)
{
if(!islower(*s))
nod->cnt++;
else
{
if(nod->fii[el]==0)
{
nod->nr_fii++;
nod->fii[el]=new Trie;
}
ins(nod->fii[el], s+1);
}
}
int del(Trie* nod, char* s)
{
if(!islower(*s))
nod->cnt--;
else if (del(nod->fii[el], s+1))
{
nod->fii[el]=0;
nod->nr_fii--;
}
if(nod->cnt==0 && nod->nr_fii==0 && nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int nr(Trie* nod, char* s)
{
if(!islower(*s))
return nod->cnt;
if(nod->fii[el]==0)
return 0;
return nr(nod->fii[el], s+1);
}
int pre(Trie* nod, char* s, int k)
{
if(!islower(*s) || nod->fii[el]==0)
return k;
return pre(nod->fii[el], s+1, k+1);
}
int main()
{
char s[25];
while(fin)
{
fin.getline(s, 25);
if(!isdigit(*s))
break;
if(*s=='0')
ins(t, s+2);
else if(*s=='1')
del(t, s+2);
else if(*s=='2')
fout<<nr(t, s+2)<<"\n";
else if(*s=='3')
fout<<pre(t, s+2, 0)<<"\n";
}
}