Pagini recente » Cod sursa (job #1982799) | Cod sursa (job #2911412) | Cod sursa (job #1253319) | Cod sursa (job #2719787) | Cod sursa (job #632692)
Cod sursa(job #632692)
#include <fstream>
#include <cstdlib>
#include <iostream>
using namespace std;
struct trie {
int data;
trie** fii;
};
std::ifstream in ("trie.in");
std::ofstream out ("trie.out");
int k,i;
trie *t;
bool b;
void add (trie *t,char *s,int off) {
if (!s[off]) {
t->data++;
return;
}
if (!t->fii) {
t->fii=(trie**) malloc (26*sizeof (trie*));
for (i=0; i<26; i++) t->fii[i]=0;
}
if (!t->fii[s[off]-'a']) {
t->fii[s[off]-'a']=(trie*) malloc (sizeof (trie));
t->fii[s[off]-'a']->data=0;
t->fii[s[off]-'a']->fii=0;
}
add (t->fii[s[off]-'a'],s,off+1);
}
void del (trie *t,char *s,int off) {
if (!s[off]) t->data--;
else {
del (t->fii[s[off]-'a'],s,off+1);
if (!t->fii[s[off]-'a']->data) {
if (t->fii[s[off]-'a']->fii)
for (i=0; i<26; i++)
if (!t->fii[s[off]-'a']->fii[i]) return;
free (t->fii[s[off]-'a']);
t->fii[s[off]-'a']=0;
}
}
}
int nr (trie *t,char *s,int off) {
if (!t) return 0;
if (!s[off]) return t->data;
if (!t->fii) return 0;
return nr (t->fii[s[off]-'a'],s,off+1);
}
int pr (trie *t,char *s,int off) {
if (!s[off]) return off;
if (!t) return off-1;
if (!t->fii) return off;
return pr (t->fii[s[off]-'a'],s,off+1);
}
void print (trie *t,int x,char *s) {
if (!t) return;
if (t->data) {
s[x]=0;
cout<<s<<"\n";
}
if (t->fii)
for (int i=0; i<26; i++) {
s[x]=i+'a';
print (t->fii[i],x+1,s);
}
}
int main () {
char s[20];
t=(trie*) malloc (sizeof (trie));
t->data=0;
t->fii=0;
while (!in.eof ()) {
in>>k;
if (!in.eof ()) {
in>>s;
if (k==0) add (t,s,0);
if (k==1) del (t,s,0);
if (k==2) out<<nr (t,s,0)<<"\n";
if (k==3) out<<pr (t,s,0)<<"\n";
}
}
//s[0]=0;
//print (t,0,s);
return 0;
}