Pagini recente » Cod sursa (job #2007939) | Cod sursa (job #2045354) | Cod sursa (job #2009863) | Cod sursa (job #1544579) | Cod sursa (job #2841372)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
char cuv[25];
struct Trie
{
int cnt,nrfii;
Trie *fiu[26];
Trie()
{
cnt=nrfii=0;
for(int i=0;i<26;i++)
fiu[i]=0;
}
};
Trie *t=new Trie;
void adauga(Trie *nod, char *s)
{
if(*s=='\0')
{
nod->cnt++;
return;
}
if(nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new Trie;
nod->nrfii++;
}
adauga(nod->fiu[*s-'a'],s+1);
}
int sterge(Trie *nod, char *s)
{
if(*s=='\0')
nod->cnt--;
else if(sterge(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0 && nod->nrfii==0 && nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int numar_aparitii(Trie *nod, char *s)
{
if(*s=='\0')
return nod->cnt;
else if(nod->fiu[*s-'a'])
return numar_aparitii(nod->fiu[*s-'a'],s+1);
return 0;
}
int lungime_prefix_comun(Trie *nod, char *s, int k)
{
if(*s=='\0' || nod->fiu[*s-'a']==0)
return k;
return lungime_prefix_comun(nod->fiu[*s-'a'],s+1,k+1);
}
int main ()
{
while(fin >> op >> cuv)
{
switch(op)
{
case 0: adauga(t,cuv); break;
case 1: sterge(t,cuv); break;
case 2: fout << numar_aparitii(t,cuv) << '\n'; break;
case 3: fout << lungime_prefix_comun(t,cuv,0) << '\n'; break;
}
}
return 0;
}