Pagini recente » Cod sursa (job #90198) | Cod sursa (job #5554) | Cod sursa (job #248428) | Cod sursa (job #1208950) | Cod sursa (job #2456680)
#include <bits/stdc++.h>
#define maxim 16389
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
unsigned long long p[maxim], bpow[maxim];
const int B = 197;
map <unsigned long long, int> fv;
void make_hash(string s, int len)
{
for (int i = 1; i < len ; ++ i)
p[i] = p[i - 1] * B + s[i];
}
bool ok (int m, int len, int k)
{
for (int end = m; end < len; ++ end)
{
unsigned long long h = p[end] - p[end - m] * bpow[m];
fv[h] ++;
if (fv[h] == k)
return true;
}
return false;
}
int main()
{
int n, k;
string s;
f >> n >> k;
f >> s;
s = '!' + s;
bpow[0] = 1;
for (int i = 1; i < maxim; ++ i)
bpow[i] = bpow[i - 1] * B;
int len = s.length();
make_hash(s, len);
int i = 1, j = n / k + 1;
int ans = 0;
while (i <= j)
{
fv.clear();
int m = (i + j) / 2;
if (ok(m, len, k))
{
ans = m;
i = m + 1;
}
else
j = m - 1;
}
g << ans;
return 0;
}