Pagini recente » Cod sursa (job #2854228) | Istoria paginii runda/lottraining/clasament | Cod sursa (job #1077941) | Cod sursa (job #3199568) | Cod sursa (job #2075085)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod
{
int vf;
nod *a[27];
int nrfii;
nod()
{
for(int i=0; i<27; i++)
a[i]=NULL;
nrfii=vf=0;
}
};
nod *tree=new nod;
void adaugare(char x[],int n,nod *v)
{
for(int i=1; i<n; i++)
{
if(v->a[x[i]-'a']==NULL)
{
nod *c=new nod();
v->a[x[i]-'a']=c;
v->nrfii++;
}
v = v->a[x[i]-'a'];
if(i==n-1)
v->vf++;
}
}
void aparitii(char x[],int n,nod *v)
{
for(int i=1; i<n; i++)
{
if(v->a[x[i]-'a']==NULL)
{
fout<<0<<endl;
return;
}
else
v = v->a[x[i]-'a'];
if(i==n-1)
fout<<v->vf<<endl;
}
}
bool stergere(char x[],int n,nod *v,int ind)
{
if(ind==n-1)
{
v->vf--;
n--;
}
else if(stergere(x,n,v->a[x[ind]-'a'],ind+1))
{
v->nrfii--;
v->a[x[ind]-'a']=NULL;
}
if(v->nrfii==0&&v->vf==0&&v!=tree)
{
delete v;
return 1;
}
return 0;
}
int prefix(char x[],int n,nod *v,int ind)
{
if(v->a[x[ind]-'a']==NULL)
return ind-1;
return prefix(x,n,v->a[x[ind]-'a'],ind+1);
}
int main()
{
int op;
char cuv[100];
while(!fin.eof())
{
fin>>op;
fin.get(cuv,1000);
if(op==0)
adaugare(cuv,strlen(cuv),tree);
if(op==1)
stergere(cuv,strlen(cuv),tree,1);
if(op==2)
aparitii(cuv,strlen(cuv),tree);
if(op==3)
fout<<prefix(cuv,strlen(cuv),tree,1)<<endl;
}
return 0;
}