Pagini recente » Cod sursa (job #1935365) | Cod sursa (job #1409017) | Cod sursa (job #1165623) | Cod sursa (job #2748850) | Cod sursa (job #2381159)
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct trie
{
int nr = 0, nrfii = 0;
trie *fii[26];
trie()
{
for(int i=0; i<26; ++i)
fii[i]=NULL;
}
}*r;
string s;
void adauga(trie *&nod, int poz)
{
if(s[poz]=='/')
{
nod->nr++;
return;
}
if(nod->fii[s[poz]-'a']==NULL)
nod->fii[s[poz]-'a']=new trie(), nod->nrfii++;
adauga(nod->fii[s[poz]-'a'], poz+1);
}
void apariti(trie *&nod, int poz)
{
if(nod==NULL)
{
cout<<"0\n";
return;
}
if(s[poz]=='/')
{
cout<<nod->nr<<"\n";
return;
}
apariti(nod->fii[s[poz]-'a'],poz+1);
}
void prefix(trie *& nod, int poz)
{
if(nod==NULL)
{
cout<<poz-3<<"\n";
return;
}
if(s[poz]=='/')
{
cout<<poz-2<<"\n";
return;
}
prefix(nod->fii[s[poz]-'a'],poz+1);
}
bool stergere(trie *& nod, int poz)
{
if(s[poz]=='/')
{
nod->nr--;
}
else{
if(stergere(nod->fii[s[poz]-'a'],poz+1)){
nod->fii[s[poz]-'a']=NULL;
nod->nrfii --;
}
}
if(nod->nr == 0 && nod->nrfii==0 && nod!=r)
{
delete nod;
return 1;
}
return 0;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
r=new trie();
ios::sync_with_stdio(false);
while(!cin.eof())
{
getline(cin,s);
s+='/';
if(s[0]=='0')
adauga(r,2);
else if(s[0]=='1')
stergere(r,2);
else if(s[0]=='2')
apariti(r,2);
else if(s[0]=='3')
prefix(r,2);
}
return 0;
}