Pagini recente » Cod sursa (job #1839484) | Cod sursa (job #640008) | Cod sursa (job #107330) | Cod sursa (job #2196506) | Cod sursa (job #1085997)
#define nume "substr"
#ifndef INFOARENA
#define fisier "../algorithm solutions/" nume
#define DBG
#else
#define fisier nume
#endif
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <cassert>
#include <cstring>
#include <map>
#ifdef INFOARENA
#include <tr1/unordered_set>
#include <tr1/unordered_map>
using namespace std::tr1;
#else
#include <unordered_set>
#include <unordered_map>
#endif
using namespace std;
ifstream fin(fisier".in");
ofstream fout(fisier".out");
#ifdef DBG
#define fout cout
#endif
const int MAX_N = 16384 + 1;
const int BASE = 123;
int n,k;
string text;
int nr_aparitii(int len)
{
unordered_map<int, int> H;
int power = 1;
int substr = 0;
for(int i = 0; i < len; i ++){
substr = (substr * BASE) + text[i];
}
for(int i = 0; i < len - 1; i ++){
power *= BASE;
}
H[substr] = 1;
for(int i = len; i < text.length(); i ++){
substr -= power * (text[i - len]);
substr = substr * BASE + text[i];
++H[substr];
#ifdef DBG
cerr<<text.substr(i-len+1,len)<<' '<< H[substr]<<'\n';
#endif
}
return max_element(H.begin(), H.end(), [](decltype(*(H.begin())) a, decltype(*(H.begin())) b){
return a.second < b.second;
})->second;
}
int caut_bin(int st, int dr)
{
if (dr < st) {
return dr;
}
int m = (st+dr)/2;
if(nr_aparitii(m) >= k)
return caut_bin(m + 1, dr);
return caut_bin(st, m - 1);
}
int main () {
fin>>n>>k>>text;
fout<<caut_bin(0, (int)text.length())<<'\n';
return 0;
}