Pagini recente » Cod sursa (job #3209372) | Cod sursa (job #2077912) | Cod sursa (job #3203321) | Cod sursa (job #411931) | Cod sursa (job #574408)
Cod sursa(job #574408)
#include <cstdio>
#include <vector>
using namespace std;
#define CH (s[0]-'a')
struct Trie {
int cnt,nrfii;
Trie *fiu[26];
Trie() {
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void add(Trie *nod, char *s) {
if (*s == '\n') {
nod->cnt ++;
return;
}
if (nod->fiu[ CH ] == 0) {
nod->fiu[ CH ] = new Trie;
nod->nrfii ++;
}
add(nod ->fiu[ CH ],s+1);
}
int del( Trie *nod, char *s) {
if (*s == '\n') {
nod -> cnt--;
}
else
if ( del(nod -> fiu[ CH ],s+1) ) {
nod -> fiu[ CH ] = 0;
nod -> nrfii--;
}
if (nod -> cnt == 0 && nod-> nrfii == 0 && nod != T ) {
delete nod; return 1;
}
return 0;
}
int cuv(Trie *nod , char *s) {
if ( *s == '\n') {
return nod -> cnt;
}
if (nod -> fiu[ CH ] ) {
return cuv( nod -> fiu[CH],s+1);
}
return 0;
}
int ask(Trie *nod, char *s,int k) {
if (nod -> fiu[ CH ] == 0 || *s == '\n')
return k;
return (ask(nod -> fiu[ CH ], s+1, k+1));
}
int main() {
FILE *f,*g;
f=fopen("trie.in","r");
g=fopen("trie.out","w");
char s[50];
fgets(s,32,f);
while (!feof(f)) {
switch (*s) {
case '0' : add(T,s+2); break;
case '1' : del(T,s+2); break;
case '2' : fprintf(g,"%d\n",cuv(T, s+2)); break;
case '3' : fprintf(g,"%d\n",ask(T, s+2, 0)); break;
}
fgets(s,32,f);
}
fclose(g);
return 0;
}