Pagini recente » Cod sursa (job #2805959) | Cod sursa (job #2519106) | Cod sursa (job #683601) | Cod sursa (job #867294) | Cod sursa (job #2633755)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int x,i,ok;
string s;
struct trie{
int nr;
map <char,trie*>m;
trie ()
{
//m.clear();
nr=0;
}
};
void adauga(trie *nod)
{
for(i=0;i<s.size();i++)
{
if(nod->m[s[i]]==nullptr){
trie *p=new trie;
nod->m[s[i]]=p;
nod=p;
}
else nod=nod->m[s[i]];
}
nod->nr++;
}
void sterge(trie *nod)
{
if(i==s.size())
{
nod->nr--;
if(nod->nr==0)ok=1;
}
else {
i++;
sterge(nod->m[s[i-1]]);
i--;
trie *fiu=nod->m[s[i]];
if(ok&&fiu->m.size()==0&&fiu->nr==0)
nod->m.erase(s[i]);
}
}
int querry1(trie *nod)
{
for(i=0;i<s.size();i++)
if(nod->m[s[i]]==nullptr)
{
nod->m.erase(s[i]);
return 0;
}
else
nod=nod->m[s[i]];
return nod->nr;
}
int querry2(int i,trie *nod)
{
//if(nod->nr>0)return 0;
if(nod->m[s[i]]!=NULL)
return 1+querry2(i+1,nod->m[s[i]]);
else {
nod->m.erase(s[i]);
return 0;
}
}
int main()
{
trie *T=new trie;
while(f>>x>>s)
{
i=ok=0;
if(x==0)adauga(T);
else
if(x==1)sterge(T);
else
if(x==2)g<<querry1(T)<<'\n';
else
if(x==3)g<<querry2(0,T)<<'\n';
}
return 0;
}