Pagini recente » Cod sursa (job #2137096) | Cod sursa (job #3169709) | Cod sursa (job #1906617) | Cod sursa (job #3257901) | Cod sursa (job #2508382)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int cod;
char s[25];
struct trie{
int fii=0, nr=0;
trie *f[26];
trie() {
for (int i=0;i<26;i++)
f[i]=0;
}
};
trie *rad=new trie;
void insertTrie(trie *r,char *s) {
if (*s!=0) {
if (r->f[*s-'a']==0) {
r->f[*s-'a']=new trie;
r->fii++;
}
insertTrie(r->f[*s-'a'],s+1);
}
else
r->nr++; //numarul de aparitii
}
int deleteTrie(trie *&r,char *s) {
if (*s==0) {
r->nr--;
if (r->nr==0&&r->fii==0&&r!=rad) { //daca nu mai apare in lista si nu mai are nimic in jos
delete r;
r=nullptr;
return 1;
}
}
else {
if (deleteTrie(r->f[*s-'a'],s+1)) {
r->fii--;
if (r->nr==0&&r->fii==0&&r!=rad) {
delete r;
r=nullptr;
return 1;
}
}
}
return 0;
}
int queryTrie(trie *r,char *s) {
if (*s==0)
return r->nr;
if (r->f[*s-'a']==nullptr)
return 0;
else
return queryTrie(r->f[*s-'a'],s+1);
}
int prefixTrie(trie *r,char *s) {
if (*s==0)
return 0;
if (r->f[*s-'a']==nullptr)
return 0;
else
return 1+prefixTrie(r->f[*s-'a'],s+1);
}
int main() {
while (fin>>cod>>s) {
switch (cod) {
case 0: insertTrie(rad,s);
break;
case 1: deleteTrie(rad,s);
break;
case 2: fout<<queryTrie(rad,s)<<"\n";
break;
case 3: fout<<prefixTrie(rad,s)<<"\n";
break;
}
}
return 0;
}