Cod sursa(job #758523)
#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;
}