Pagini recente » Cod sursa (job #2723747) | Cod sursa (job #2401895) | Cod sursa (job #2344684) | Cod sursa (job #2760514) | Cod sursa (job #1419879)
#include <fstream>
#include <unordered_map>
using namespace std;
const int kMaxN = 16390;
const int kMaxLg = 15;
int N, K;
char a[kMaxN];
int lg2[kMaxN];
int hsh[kMaxLg][kMaxN];
unordered_map<int, int> cnt;
int Hash(int a, int b) {
return (a * 479001599LL + b * 433494437LL) % 39916801;
}
void MakeHash() {
for (int i = 2; i < kMaxN; ++i)
lg2[i] = lg2[i >> 1] + 1;
for (int i = 1; i <= N; ++i)
hsh[0][i] = a[i];
for (int i = 1; i < kMaxLg; ++i)
for (int j = 1; j <= N - (1 << i) + 1; ++j)
hsh[i][j] = Hash(hsh[i - 1][j], hsh[i - 1][j + (1 << (i - 1))]);
}
bool Check(int len) {
cnt.clear();
int lg = lg2[len];
for (int i = 1; i <= N - len + 1; ++i) {
int crt = Hash(hsh[lg][i], hsh[lg][i + len - (1 << lg)]);
++cnt[crt];
if (cnt[crt] == K)
return true;
}
return false;
}
int Solve() {
int ans = 0;
for (int step = 1 << kMaxLg; step; step >>= 1)
if (Check(ans | step))
ans |= step;
return ans;
}
int main() {
ifstream("substr.in") >> N >> K >> (a + 1);
MakeHash();
ofstream("substr.out") << Solve() << "\n";
return 0;
}