Pagini recente » Cod sursa (job #1986907) | Cod sursa (job #1879499) | Cod sursa (job #72749) | Cod sursa (job #2725428) | Cod sursa (job #1509321)
#include<fstream>
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie {
int cnt, nrfii;
Trie *fiu[26];
Trie() {
cnt = nrfii = 0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
void ins(Trie *nod, char *s) {
if(*s=='\n') {
++nod->cnt;
return;
}
if(nod->fiu[*s-'a']==0) {
nod->fiu[*s-'a'] = new Trie;
++nod->nrfii;
}
ins(nod->fiu[*s-'a'],s+1);
}
int del(Trie *nod, char *s) { //only call if exists!!
if(*s == '\n')
--nod->cnt;
else if(del(nod->fiu[*s-'a'],s+1)) {
nod->fiu[*s-'a'] = 0;
--nod->nrfii;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod !=T) {
delete nod;
return 1;
}
return 0;
}
int number(Trie *nod, char *s) {
if(*s == '\n') {
return nod->cnt;
}
if(nod->fiu[*s-'a']) {
return number(nod->fiu[*s-'a'],s+1);
}
return 0;
}
int longest_prefix(Trie *nod, char *s, int k) {
if(*s == '\n' || nod->fiu[*s-'a'] == 0) {
return k;
}
return longest_prefix(nod->fiu[*s-'a'],s+1,k+1);
}
int main() {
char line[32];
freopen( "trie.in","r",stdin );
freopen( "trie.out","w",stdout );
fgets(line,32,stdin );
while(!feof(stdin)) {
if(line[0]=='0') {
ins(T, line+2);
}
if(line[0]=='1') {
del(T, line+2);
}
if(line[0]=='2') {
printf("%d\n",number(T, line+2));
}
if(line[0]=='3') {
printf("%d\n",longest_prefix(T, line+2,0));
}
fgets( line, 32, stdin );
}
return 0;
}