Pagini recente » Cod sursa (job #3359961) | Monitorul de evaluare | Cod sursa (job #3359566) | Cod sursa (job #3359563) | Cod sursa (job #3360690)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod {
Nod* litera[26]{};
int aparitii=0;
};
class Trie {
public:
Nod* root=new Nod;
void insert(const string& s) {
Nod* t=root;
for(auto ch:s) {
int index=ch-'a';
if(t->litera[index]==nullptr) {
Nod* newLetter=new Nod();
t->litera[index]=newLetter;
}
t=t->litera[index];
}
++t->aparitii;
}
bool areCopil(Nod* target) {
for(int i=0;i<26;++i)
if(target->litera[i])
return 1;
return 0;
}
bool sterge(Nod* target,const string& s,int index) {
if(target==nullptr) return 0;
if(index==s.size()) {
--target->aparitii;
return !target->aparitii&&!areCopil(target);
}
int ch=s[index]-'a';
if(sterge(target->litera[ch],s,index+1)) {
delete target->litera[ch];
target->litera[ch]=nullptr;
return !target->aparitii&&!areCopil(target);
}
return 0;
}
void nrApariti(const string& s) {
Nod* t=root;
for(auto ch:s) {
int index=ch-'a';
if(t->litera[index]==nullptr) {
fout<<"0\n";
return;
}
t=t->litera[index];
}
fout<<t->aparitii<<'\n';
}
void prefix(const string& s) {
Nod* t=root;
int lungime=0;
for(auto ch:s) {
int index=ch-'a';
if(t->litera[index]==nullptr) {
fout<<lungime<<"\n";
return;
}
t=t->litera[index];
++lungime;
}
fout<<lungime<<'\n';
}
};
int main()
{
Trie head;
string s;
char op;
while(fin>>op>>s) {
switch(op) {
case '0':
head.insert(s);
break;
case '1':
head.sterge(head.root,s,0);
break;
case '2':
head.nrApariti(s);
break;
default:
head.prefix(s);
}
}
return 0;
}