Cod sursa(job #758523)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 15 iunie 2012 21:29:52
Problema Substr Scor 20
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <map>

#define FISIN   "substr.in"
#define FISOUT  "substr.out"

struct TrieNode {
  TrieNode() : occ(0) { }

  TrieNode* getChild(char c) {
    kids_t::iterator it = kids.find(c);
    if (it == kids.end()) return NULL;
    return it->second;
  }

  TrieNode* getOrAddChild(char c) {
    TrieNode* node = getChild(c);
    if (node) return node;
    kids[c] = node = new TrieNode;
    return node;
  }

  typedef std::map<char, TrieNode*> kids_t;
  kids_t kids;
  int occ;
};

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  int n, k;
  char buffer[16384 * 2];

  fscanf(fin, "%d %d", &n, &k);
  fscanf(fin, "%s", buffer);

  int best_len = 0;
  TrieNode* root = new TrieNode;
  for (int i = 0; buffer[i]; ++i) {
    TrieNode* node = root;
    for (int j = 0; buffer[i + j]; ++j) {
      node = node->getOrAddChild(buffer[i + j]);
      ++node->occ;
      if (node->occ >= k) {
	if (j + 1 > best_len)
	  best_len = j + 1;
      }
    }
  }

  printf("%d\n", best_len);
  fprintf(fout, "%d\n", best_len);

  fclose(fout);
  fclose(fin);
  return 0;
}