Pagini recente » Cod sursa (job #3181118) | Cod sursa (job #2564135) | Cod sursa (job #2721706) | Cod sursa (job #456500) | Cod sursa (job #2875308)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int SIGMA=26;
struct trie
{
trie *fii[SIGMA];
int nrFii,frecv;
trie()
{
nrFii=0,frecv=0;
for(int i=0;i<SIGMA;i++) fii[i]=NULL;
}
};
trie *T=new trie;
void Insert(trie *nod,char *s)
{
if(*s == '\0')
{
nod->frecv++;
//cout<<'a';
//cout<<nod->frecv<<'\n';
return;
}
if(nod->fii[*s-'a'] == NULL)
{
nod->fii[*s-'a']=new trie;
nod->nrFii++;
}
Insert(nod->fii[*s-'a'], s+1);
}
bool Delete(trie *nod,char *s)
{
if(*s =='\0') nod->frecv--;
else if(nod->fii[*s-'a'] != NULL && Delete(nod->fii[*s-'a'],s+1))
{
nod->fii[*s-'a']=NULL;
nod->nrFii--;
}
if(nod->nrFii == 0 && nod->frecv == 0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int Query(trie *nod,char *s)
{
if(*s=='\0') return nod -> frecv;
else if(nod -> fii[*s-'a'] != NULL) return Query(nod -> fii[*s-'a'], s+1);
return 0;
}
int Prefix(trie *nod, char *s, int lungime)
{
if(*s == '\0' || nod->fii[*s-'a'] == NULL) return lungime;
return Prefix(nod->fii[*s-'a'],s+1,lungime+1);
}
int main()
{
int x;
char c[21];
while(in>>x>>c)
{
switch(x)
{
case 0: Insert(T,c);break;
case 1: Delete(T,c);break;
case 2: out<<Query(T,c)<<'\n' ;break;
case 3: out<<Prefix(T,c,0)<<'\n';break;
}
}
}