Pagini recente » Cod sursa (job #309673) | Cod sursa (job #3223235) | Cod sursa (job #220) | b0$$ de b0$$ | Cod sursa (job #1074148)
#include <fstream>
#include <unordered_map>
#include <string.h>
using namespace std;
const int BASE = 73;
int sol, n, k;
string s;
void get_data(){
ifstream in("substr.in");
in>>n>>k;
in>>s;
in.close();
}
bool ok(int dim){
unordered_map< unsigned int, int> hash;
unsigned int key = 0, power = 1;
for (int i = 0; i < dim; ++i){
key = key * BASE + s[i];
if (i) power *= BASE;
}
if (hash[key] >= k) return 1;
hash[key] = 1;
for (int i = dim; dim < n; ++i){
key = (key - power * s[i - dim]) * BASE + s[i];
if (hash.find(key) != hash.end() ) hash[key]++;
else hash[key] = 1;
if (hash[key] >= k ) return 1;
}
return 0;
}
int solve(){
int left = 0, right = n, middle;
if (k==1) return n;
while( left <= right ){
middle = (left+right) / 2;
if ( ok(middle) ) {
sol = middle;
left = middle + 1;
}else
right = middle - 1;
}
return sol;
}
int main(){
get_data();
ofstream out("substr.out");
out<<solve();
out.close();
return 0;
}