Pagini recente » Cod sursa (job #830891) | Cod sursa (job #48319) | Cod sursa (job #1107231) | Cod sursa (job #2887599) | Cod sursa (job #3259398)
#include <bits/stdc++.h>
#define int unsigned int
#define DIM 17000
#define BASE1 2011
#define BASE2 666013
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
map <int, int> mp;
string s;
int _hash1[DIM], power1[DIM], _hash2[DIM], power2[DIM];
int n, i, k, st, dr, mij, ret;
void Build_Hash(){
power1[0] = 1;
power2[0] = 1;
for(i=1;i<=n;i++){
power1[i] = power1[i - 1] * BASE1;
power2[i] = power2[i - 1] * BASE2;
}
_hash1[1] = s[0];
_hash2[1] = s[0];
for(i=2;i<=n;i++){
_hash1[i] = _hash1[i - 1] * BASE1 + s[i - 1];
_hash2[i] = _hash2[i - 1] * BASE2 + s[i - 1];
}
}
int get_hash(int st, int dr){
return (_hash1[dr] - _hash1[st - 1] * power1[dr - st + 1]) * BASE1 + _hash2[dr] - _hash2[st - 1] * power2[dr - st + 1];
}
bool check(int ret){
mp.clear();
for(i=1;i<=n-ret+1;i++){
mp[get_hash(i, i + ret - 1)]++;
if(mp[get_hash(i, i + ret - 1)] >= k)
return true;
}
return false;
}
int32_t main(){
fin >> n >> k >> s;
Build_Hash();
st = 1, dr = n;
while(st <= dr){
mij = (st + dr) >> 1;
if(check(mij)){
ret = mij;
st = mij + 1;
}
else dr = mij - 1;
}
fout << ret;
}