Pagini recente » Cod sursa (job #643625) | Cod sursa (job #2503897) | Cod sursa (job #2189419) | Cod sursa (job #2050277) | Cod sursa (job #2523156)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int n;
string cuv;
typedef struct Trie* nod;
struct Trie
{
int nrCuv=0;
nod alf[26];
};
nod rad;
void adauga(string cuv)
{
nod p=rad;
p->nrCuv++;
for(int i=0;i<cuv.size();i++)
if(p->alf[ cuv[i]-'a' ]!=NULL)
{
p=p->alf[ cuv[i]-'a' ];
p->nrCuv++;
}
else
{
nod c=new Trie;
c->nrCuv++;
p->alf[ cuv[i]-'a' ]=c;
p=c;
}
}
void sterge(string cuv,nod p=rad,int poz=0)
{
if(poz==cuv.size())
return;
p->nrCuv--;
if(p->alf[ cuv[poz]-'a' ]!=NULL)
{
bool ok=0;
if(p->alf[ cuv[poz]-'a']->nrCuv==1 )
ok=1;
sterge(cuv,p->alf[ cuv[poz]-'a' ],poz+1);
if(ok)
p->alf[ cuv[poz]-'a' ]=NULL;
}
if(p->nrCuv==0 && p!=rad)
delete p;
cout<<1<<' ';
}
int aparitii(string cuv)
{
nod p=rad;
for(int i=0;i<cuv.size();i++)
if(p->alf[ cuv[i]-'a' ]==NULL)
return 0;
else
p=p->alf[ cuv[i]-'a' ];
int nr=p->nrCuv;
for(int i=0;i<='z'-'a';i++)
if(p->alf[i])
nr-=p->alf[i]->nrCuv;
return nr;
}
int prefix(string cuv)
{
nod p=rad;
for(int i=0;i<cuv.size();i++)
if(p->alf[ cuv[i]-'a' ]==NULL)
return i;
else
p=p->alf[ cuv[i]-'a' ];
return cuv.size();
}
int main()
{
rad=new Trie;
while(in)
{
in>>n>>cuv;
if(!in)
break;
int nr;
switch(n)
{
case 0:adauga(cuv);break;
case 1:sterge(cuv);break;
case 2:out<<aparitii(cuv)<<'\n';break;
case 3:out<<prefix(cuv)<<'\n';break;
default:break;
}
}
return 0;
}