Pagini recente » Cod sursa (job #549630) | Cod sursa (job #358515) | Cod sursa (job #2920048) | Cod sursa (job #577343) | Cod sursa (job #2399838)
#include <bits/stdc++.h>
#define CH (*c-'a')
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;
vector<pair<Trie*,char>>v;
char sir[25];
int main()
{
int op;
while(fin>>op)
{
fin>>sir;
if(op==0){
Trie *r=T;
int l=strlen(sir);
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){
Trie *r=T,*rfiu;
int l=strlen(sir);
char c;
for(int i=0;i<l;i++)
{
r->CntP--;
if(r->CntP==1)v.push_back(make_pair(r,sir[i]));
else if(r->CntP>1)
{
v.clear();
}
r=r->fiu[sir[i]];
}
r->EndW--;
int k=v.size();
for(int i=k-1;i>=0;i--)
{
tie(r,c)=v[i];
rfiu=r->fiu[c];
if(rfiu->EndW==0 && rfiu->CntP==0 && rfiu!=T)
{
//r->fiu.erase(c);
r->lit[int(c-'a')]=0;
delete (rfiu);
}else break;
}
v.clear();
}
if(op==2){
Trie *r=T;
int l=strlen(sir);
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)
{
int prefix=0;
Trie *r=T;
int l=strlen(sir);
for(int i=0;i<l;i++)
{
if(!r->lit[int(sir[i]-'a')])break;
prefix++;
r=r->fiu[sir[i]];
}
fout<<prefix<<'\n';
}
}
return 0;
}