Pagini recente » Cod sursa (job #2211871) | Cod sursa (job #2550990) | Cod sursa (job #1619641) | Cod sursa (job #1766788) | Cod sursa (job #2399814)
#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
Trie()
{
EndW=CntP=0;
}
};
Trie *T= new Trie;
vector<pair<Trie*,char>>v;
char sir[25];
int del(Trie *nod, int k)
{
if(k==strlen(sir)-1)nod->EndW--;
else{
if(del(nod->fiu[sir[k]],k+1))
{
nod->fiu.erase(sir[k]);
nod->CntP--;
}
}
if(nod->CntP==0 && nod->EndW==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int main()
{
int op;
while(fin>>op>>sir)
{
if(op==0){
Trie *r=T;
int l=strlen(sir);
for(int i=0;i<l;i++)
{
if(r->fiu.find(sir[i])==r->fiu.end())
{
r->fiu[sir[i]]=new Trie;
r->CntP++;
}
r=r->fiu[sir[i]];
}
r->EndW++;
}
if(op==1){
del(T,0);
}
if(op==2){
Trie *r=T;
int l=strlen(sir);
int i;
for(i=0;i<l;i++)
{
if(r->fiu.find(sir[i])==r->fiu.end())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->fiu.find(sir[i])==r->fiu.end())break;
prefix++;
r=r->fiu[sir[i]];
}
fout<<prefix<<'\n';
}
}
}