Pagini recente » Monitorul de evaluare | Cod sursa (job #1323533) | Cod sursa (job #1333001) | Cod sursa (job #208720) | Cod sursa (job #2238676)
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream cin ("substr.in");
ofstream cout ("substr.out");
const int NMAX = (1 << 14);
const int MOD = 1000000007;
const int P = 26;
int n, k;
char s[1 + NMAX];
int hash1[1 + NMAX];
int put[1 + NMAX];
bool ok(int lg) {
int sol = 1;
unordered_map <int, int> f;
f[hash1[lg]]++;
for(int i = lg + 1; i <= n; i++) {
int h = (hash1[i] - (1LL * hash1[i - lg] * put[lg]) % MOD + MOD) % MOD;
f[h]++;
}
for(auto it : f)
sol = max(sol, it.second);
return (sol >= k);
}
int cb(int st, int dr) {
int mid;
while(st <= dr) {
mid = (st + dr) / 2;
if(ok(mid))
st = mid + 1;
else
dr = mid - 1;
}
return dr;
}
int main() {
cin >> n >> k >> (s + 1);
put[0] = 1;
for(int i = 1; i <= n; i++) {
put[i] = 1LL * put[i - 1] * P % MOD;
hash1[i] = (1LL * hash1[i - 1] * P + s[i] - 'a') % MOD;
}
cout << cb(1, n);
return 0;
}