Pagini recente » Cod sursa (job #1242003) | Cod sursa (job #437468) | Cod sursa (job #1586735) | Cod sursa (job #90637) | Cod sursa (job #1098698)
#include <cstdio>
#include <cstring>
using namespace std;
char Text[35];
struct TRIE
{
TRIE *Fiu[26];
int NrFii,NrAparitii;
TRIE(){
NrFii = 0;
for(int i = 0; i < 26; i++){
Fiu[i] = 0;
}
}
};
TRIE *T = new TRIE;
inline int Code(char C)
{
return ((int)C - (int)'a');
}
void Insert(TRIE *Node, char *Letter){
if (*Letter == '\n') {
Node -> NrAparitii++;
return;
}
int C = Code(*Letter);
if (Node -> Fiu[C] == NULL) {
Node->NrFii++;
Node->Fiu[C] = new TRIE;
}
Insert(Node->Fiu[C], Letter+1);
}
int Query(TRIE *Node, char *Letter){
if (*Letter == '\n') {
return Node->NrAparitii;
}
int C = Code(*Letter);
if (Node -> Fiu[C]) {
return Query(Node->Fiu[C], Letter+1);
}
return 0;
}
int Prefix(TRIE *Node, char *Letter, int count){
if (*Letter == '\n') {
return count;
}
int C = Code(*Letter);
if (Node -> Fiu[C] == 0) {
return count;
}
return Prefix(Node->Fiu[C], Letter+1, count+1);
}
int Delete(TRIE *Node, char *Letter){
if (*Letter == '\n') {
Node->NrAparitii--;
}else{
int C = Code(*Letter);
if(Delete(Node->Fiu[C], Letter+1)){
Node->Fiu[C] = 0;
Node->NrFii--;
}
}
if (Node->NrFii == 0 && Node->NrAparitii == 0) {
delete Node;
return 1;
}
return 0;
}
void Read(){
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
while( fgets( Text, 35, stdin ) ) {
if (Text[0] == '0') {
Insert(T, Text+2);
}else if (Text[0] == '1') {
Delete(T, Text+2);
}else if (Text[0] == '2') {
printf("%d\n", Query(T, Text+2));
}else if (Text[0] == '3') {
printf("%d\n", Prefix(T, Text+2, 0));
}
}
}
int main()
{
Read();
return 0;
}