Pagini recente » Cod sursa (job #2737572) | Cod sursa (job #2133168) | Cod sursa (job #729955) | Cod sursa (job #194727) | Cod sursa (job #2523325)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
typedef struct Trie* nod;
struct Trie
{
int nrCuv=0;
nod alf[26];
};
nod rad;
void adauga(string cuv)
{
nod p=rad;
for(auto lit:cuv)
if(p->alf[ lit-'a' ]!=NULL)
{
p=p->alf[ lit-'a' ];
p->nrCuv++;
}
else
{
nod add=new Trie;
add->nrCuv=1;
p->alf[ lit-'a' ]=add;
p=add;
}
}
void sterge(string cuv)
{
nod p=rad;
int poz=0;
while( poz<cuv.size() && p->alf[ cuv[poz]-'a' ]!=NULL && p->alf[ cuv[poz]-'a' ]->nrCuv > 1 )
{
p=p->alf[ cuv[poz]-'a' ];
p->nrCuv--;
poz++;
}
if(poz==cuv.size())
return;
p->alf[ cuv[poz]-'a' ]=NULL;
}
int aparitii(string cuv)
{
nod p=rad;
for(auto lit:cuv)
if(p->alf[ lit-'a' ]==NULL)
return 0;
else
p=p->alf[ lit-'a' ];
int nr=p->nrCuv;
for(int i=0;i<=25;i++)
if(p->alf[i]!=NULL)
nr-=p->alf[i]->nrCuv;
return nr;
}
int prefix(string cuv)
{
nod p=rad;
for(int poz=0;poz<cuv.size();poz++)
if(p->alf[ cuv[poz]-'a' ]==NULL)
return poz;
else
p=p->alf[ cuv[poz]-'a' ];
return (int)cuv.size();
}
int main()
{
rad=new Trie;
int c;
string cuv;
while(in)
{
in>>c>>cuv;
if(!in)
return 0;
switch(c)
{
case 0:adauga(cuv);break;
case 1:sterge(cuv);break;
case 2:out<<aparitii(cuv)<<'\n';break;
case 3:out<<prefix(cuv)<<'\n';break;
}
}
return 0;
}