Pagini recente » Monitorul de evaluare | Cod sursa (job #138340) | Cod sursa (job #175943) | Cod sursa (job #3246989) | Cod sursa (job #2021568)
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream cin("substr.in");
ofstream cout("substr.out");
/*ifstream cin("input");
ofstream cout("output");*/
const unsigned long long base = 197;
unsigned long long hsh[16500];
unsigned long long put[16500];
char sir[16500];
unordered_map <unsigned long long , int> M;
int main() {
/* ios::sync_with_stdio(false);
cin.tie(NULL);*/
put[0] = 1;
for (int i=1; i<=16500; 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){
//cout<<x.first<<" "<<x.second<<'\n';
if (x.second >= k){
gasit = true;
ans = mij;
break;
}
}
M.clear();
if (gasit == true){
st = mij + 1;
}
else{
if (st == dr){
break;
}
dr = mij;
}
}
cout<<ans;
return 0;
}