Pagini recente » Cod sursa (job #393577) | Cod sursa (job #523008) | Cod sursa (job #478368) | Cod sursa (job #964382) | Cod sursa (job #2403602)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
map<char,Trie*>fiu;
int EndW,CntP;//final de cuvant si prefix
bitset<26>lit;
Trie()
{
EndW=CntP=0;
lit.reset();
}
};
Trie *T= new Trie;
Trie *r,*rfiu;
Trie* v[21];
char sir[25],c;
int cnt,l;
int del(Trie *nod,int i)
{
if(i==l)nod->EndW--;
else{
if(del(nod->fiu[sir[i]],i+1))
{
nod->lit[sir[i]-'a']=0;
nod->CntP--;
}
}
if(nod->EndW==0 && nod->CntP==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int main()
{
int op;
while(fin>>op)
{
fin>>sir;
l=strlen(sir);
if(op==0)
{
r=T;
for(int i=0; i<l; i++)
{
if(!r->lit[int(sir[i]-'a')])
{
r->fiu[sir[i]]=new Trie;
r->lit[int(sir[i]-'a')]=1;
}
r->CntP++;
r=r->fiu[sir[i]];
}
r->EndW++;
}
if(op==1)
del(T,0);
if(op==2)
{
r=T;
int i;
for(i=0; i<l; i++)
{
if(!r->lit[int(sir[i]-'a')])
break;
r=r->fiu[sir[i]];
}
if(i<l)
fout<<"0\n";
else
fout<<r->EndW<<'\n';
}
if(op==3)
{
r=T;
int i;
for(i=0; i<l; i++)
{
if(!r->lit[int(sir[i]-'a')])
break;
r=r->fiu[sir[i]];
}
fout<<i<<'\n';
}
}
return 0;
}