Pagini recente » Cod sursa (job #3276116) | Cod sursa (job #3274361) | Arhiva Educationala | Clasament 121 | Cod sursa (job #3004999)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod {
int nr_ap=0;
int nr_cuv=0;
vector<nod *> fii;
nod() {
fii.resize(26, 0);
}
} *r;
nod *trie_insert(nod *r, char *s) {
if (!r)
r=new nod;
r->nr_ap++;
if (s[0]=='\0')
r->nr_cuv++;
else
r->fii[s[0]-'a']=trie_insert(r->fii[s[0]-'a'], s+1);
return r;
}
nod *trie_delete(nod *r, char *s) {
if (!r)
return r;
r->nr_ap--;
if (s[0]=='\0')
r->nr_cuv--;
else
r->fii[s[0]-'a']=trie_delete(r->fii[s[0]-'a'], s+1);
if (!r->nr_ap) {
delete r;
r=0;
}
return r;
}
int aparitii(nod *r, char *s) {
if (!r)
return 0;
if (s[0]=='\0')
return r->nr_cuv;
else
return aparitii(r->fii[s[0]-'a'], s+1);
}
int pref_max(nod *r, char *s) {
if (!r)
return 0;
if (s[0]=='\0' || !r->fii[s[0]-'a'])
return 0;
else
return pref_max(r->fii[s[0]-'a'], s+1)+1;
}
void citire() {
int op;
char s[25];
while (fin>>op) {
fin>>s;
if (op==0)
r=trie_insert(r, s);
else if (op==1)
r=trie_delete(r, s);
else if (op==2)
fout<<aparitii(r, s)<<"\n";
else
fout<<pref_max(r, s)<<"\n";
}
}
int main() {
citire();
return 0;
}