Cod sursa(job #1514874)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 31 octombrie 2015 19:16:16
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

using namespace std;

const int SIGMA = 26;
const char FIRST = 'a';
const int kLmax = 20;

struct Trie {
  Trie *next[SIGMA];
  int contor;
};

void trieInsert(Trie* &node, char *s) {
  if (*s == '\0') {
    node->contor++;
  } else {
    if (node->next[*s - FIRST] == NULL) {
      node->next[*s - FIRST] = new Trie;
    }
    trieInsert(node->next[*s - FIRST], s + 1);
  }
}

int trieQuery(Trie *node, char *s) {
  if (*s == '\0') {
    return node->contor; 
  } else {
    if (node->next[*s - FIRST] == NULL) {
      return 0;
    } else {
      return trieQuery(node->next[*s - FIRST], s + 1);
    }
  }
}

bool trieErase(Trie* &node, char *s) {
  if (*s == '\0') {
    if (node->contor != 0) {
      node->contor--;
      return 1;
    }
  } else {
    if (node->next[*s - FIRST] != NULL) {
      Trie *son = node->next[*s - FIRST];
      bool toDelete = trieErase(son, s + 1);
      if (toDelete) {
	toDelete = (son->contor == 0);
	for (int i = 0; i < SIGMA; i++) {
	  toDelete &= (son->next[i] == NULL);
	}
	if (toDelete) {
	  delete son;
	  node->next[*s - FIRST] = NULL;
	  return 1;
	}
      }
    }
  }
  return 0;
}

int lcp(Trie *node, char *s) {
  if (*s == '\0') {
    return 0;
  } else {
    if (node->next[*s - FIRST] != 0) {
      return 1 + lcp(node->next[*s - FIRST], s + 1);
    }
    return 0;
  }
}

Trie *Root;

int main(void) {
  ifstream in("trie.in");
  ofstream out("trie.out");
  int opType;
  char s[kLmax + 1];
  
  Root = new Trie;

  while (in >> opType >> s) {
    if (opType == 0) {
      trieInsert(Root, s);
    } else if (opType == 1) {
      trieErase(Root, s);
    } else if (opType == 2) {
      out << trieQuery(Root, s) << '\n';
    } else {
      out << lcp(Root, s) << '\n';
    }
  }
  in.close();
  out.close();
  return 0;
}