Pagini recente » Cod sursa (job #3227999) | Cod sursa (job #2594293) | Cod sursa (job #1739322) | Cod sursa (job #2692908) | Cod sursa (job #1074156)
#include <fstream>
#include <unordered_map>
using namespace std;
const int BASE = 73;
const int NMAX = 16390;
int sol, n, k;
char s[NMAX];
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;
}
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;
}