Pagini recente » Cod sursa (job #1553875) | Rating FireDK (FireDK) | Istoria paginii runda/ms98 | Cod sursa (job #1532052) | Cod sursa (job #468766)
Cod sursa(job #468766)
using namespace std;
#include <cstring>
#include<fstream>
#include<cstdio>
#include<iostream>
int N;
struct nod{
nod *next[26];
int nrap,nrs;
nod()
{
memset(next,0,sizeof(next));
nrap=0;
nrs=0;
}
};
ofstream fout("trie.out");
char demo[50];
typedef nod* trie;
trie R=new nod;
void ins(trie &n, int p)
{ if(p==N)
{ n->nrap++;
return;
}
if(n->next[demo[p]-'a']==NULL) //-----------------------------------
{
n->next[demo[p]-'a']=new nod;
n->nrs++;
}
ins(n->next[demo[p]-'a'],p+1);
}
int sterge(trie &n,int p)
{
if(p==N)
n->nrap--;
else
if(sterge(n->next[demo[p]-'a'],p+1))
{ n->nrs--;
n->next[demo[p]-'a']=NULL;
}
if(n->nrs==0&&n->nrap==0&&n!=R)
{
delete n;
return 1;
}
return 0;
}
int nrapar(trie &n,int p)
{
if(demo[p]=='\0')
return n->nrap;
if(n->next[demo[p]-'a'])
return nrapar(n->next[demo[p]-'a'],p+1);
return 0;
}
int cauta(trie &n,int p,int k)
{
if(p==N||n->next[demo[p]-'a']==NULL)
return k;
return cauta(n->next[demo[p]-'a'],p+1,k+1);
}
void cit()
{char x;
int dumm;
ifstream fin("trie.in");
while(fin>>dumm)
{fin.get(demo,2);
fin.getline(demo,50);
N=strlen(demo);
if(dumm==0) ins(R,0);
if(dumm==1) sterge(R,0);
if(dumm==2) fout<<nrapar(R,0)<<"\n";
if(dumm==3) fout<<cauta(R,0,0)<<"\n";
}
}
int main()
{
cit();
fout.close();
return 0;
}