Pagini recente » Monitorul de evaluare | Cod sursa (job #1973025) | Profil Cristyano96 | Monitorul de evaluare | Cod sursa (job #2021557)
#include <iostream>
#include <map>
using namespace std;
const unsigned long long base = 197;
unsigned long long hsh[40100];
unsigned long long put[40100];
char sir[40100];
map <unsigned long long , int> M;
int main() {
/*freopen ("input" , "r" , stdin);
freopen ("output" , "w" , stdout);*/
ios::sync_with_stdio(false);
cin.tie(NULL);
put[0] = 1;
for (int i=1; i<=20000; i++){
put[i] = put[i-1];
put[i] *= base;
}
int n , k;
cin>>n>>k;
for (int i=1; i<=n; i++){
cin>>sir[i];
}
for (int i=n; i>=1; i--){
hsh[i] = hsh[i + 1];
hsh[i] *= base;
hsh[i] += 1ULL * sir[i];
}
int st = 0;
int dr = n;
int ans = 0;
while(st <= dr){
//cout<<st<<" "<<dr<<'\n';
bool gasit = false;
int mij = (st + dr) / 2;
for (int i=1; i<=n-mij+1; i++){
unsigned long long h = hsh[i] - (hsh[i + mij] * put[mij]);
M[h] ++;
}
for (auto x : M){
if (x.second >= k){
gasit = true;
ans = mij;
break;
}
}
M.clear();
if (gasit == true){
st = mij + 1;
}
else{
dr = mij;
}
if (st == dr){
break;
}
}
cout<<ans;
return 0;
}