Pagini recente » Cod sursa (job #1359749) | Cod sursa (job #1359680) | Cod sursa (job #1661465) | Cod sursa (job #1359483) | Cod sursa (job #2197067)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie {
trie *fii[26];
int nrfii,cnt;
trie() {
nrfii=cnt=0;
memset(fii,0,sizeof(fii));
}
}*T;
void add(trie *nod,char *s) {
if (*s=='\n')
nod->cnt++;
else {
if (!nod->fii[*s-'a']) {
nod->fii[*s-'a']=new trie;
nod->nrfii++;
}
add(nod->fii[*s-'a'],s+1);
}
}
int aparitii(trie *nod,char *s) {
if (*s=='\n') return nod->cnt;
if (nod->fii[*s-'a']) return aparitii(nod->fii[*s-'a'],s+1);
return 0;
}
int prefix(trie *nod,char *s,int k) {
if (*s=='\n' || nod->fii[*s-'a']==0) return k;
else prefix(nod->fii[*s-'a'],s+1,k+1);
}
int del(trie *nod,char *s) {
if (*s=='\n') nod->cnt--;
else if(del(nod->fii[*s-'a'],s+1)) {
nod->fii[*s-'a']=NULL;
nod->nrfii--;
}
if (nod!=T && nod->cnt==0 && nod->nrfii==0) {
delete nod;
return 1;
}
return 0;
}
int main() {
int x,y;
char s[25];
T=new trie;
while (f.getline(s,25)) {
strcat(s,"\n");
switch (s[0]) {
case '0': add(T,s+2); break; ///adaugare
case '1': del(T,s+2); break; ///stergere
case '2': g<<aparitii(T,s+2)<<'\n'; break; ///tiparire nr aparitii
case '3': g<<prefix(T,s+2,0)<<'\n'; break; ///tiparire lungime prefix maxim
}
}
return 0;
}