Pagini recente » Cod sursa (job #201085) | Cod sursa (job #1734056) | Cod sursa (job #642092) | Cod sursa (job #1469673) | Cod sursa (job #536449)
Cod sursa(job #536449)
using namespace std;
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
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;
ifstream fin("trie.in");
int dumm;
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";
}
fin.close();
}
int main()
{
cit();
fout.close();
return 0;
}