Pagini recente » Cod sursa (job #3122128) | Cod sursa (job #2866303) | Cod sursa (job #345600) | Cod sursa (job #2709350) | Cod sursa (job #674113)
Cod sursa(job #674113)
#include<fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
class trie
{
struct node
{ int nr_fii;
int nr_word;
node *sons[26];
node()
{ nr_fii = nr_word = 0;
for(int i = 0; i < 26; i++) sons[i] = NULL;
}
};
node *root;
public:
trie()
{ root = new node;
}
void R_push(char *str, node *p)
{ if(*str == NULL)
{ p->nr_word++;
return;
}
if(p->sons[*str - 97] == NULL)
{ p->sons[*str - 97] = new node;
p->nr_fii++;
}
R_push(str + 1, p->sons[*str - 97]);
}
int R_pop(char *str, node *p)
{
if(*str == NULL)
p->nr_word--;
else if(R_pop(str + 1, p->sons[*str - 97]))
{ p->sons[*str - 97] = NULL;
p->nr_fii--;
}
if(p->nr_word == 0 && p->nr_fii == 0 && p != root)
{ delete p; return 1;
}
return 0;
}
void push(char *str)
{ R_push(str, root);
}
void pop(char *str)
{ R_pop(str, root);
}
int count(char *str)
{ node *p = root;
while(*str)
{ if(p->sons[*str - 97] == NULL) return p->nr_word;
p = p->sons[*str - 97];
str++;
}
return p->nr_word;
}
int long_com_pref(char *str)
{ int longest = 0;
node *p = root;
while(*str)
{ if(p->sons[*str - 97] == NULL) return longest;
p = p->sons[*str - 97];
longest++;
str++;
}
return longest;
}
};
trie A;
int main()
{ int op;
char word[21];
while(f>>op>>word)
{ //f>>op>>word;
switch(op)
{ case 0: A.push(word); break;
case 1: A.pop(word); break;
case 2: g<<A.count(word)<<'\n'; break;
case 3: g<<A.long_com_pref(word)<<'\n'; break;
}
}
f.close();
g.close();
return 0;
}