Pagini recente » Cod sursa (job #263258) | Cod sursa (job #1877430) | Cod sursa (job #3133769) | Cod sursa (job #744670) | Cod sursa (job #3134466)
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream in ("substr.in");
ofstream out ("substr.out");
const int max_size = 16385, baza = 29, mod = 1e9 + 7;
int v[max_size], n, k;
bool check (int l)
{
unordered_map <long long, int> m;
long long hsh = 0, ptr = 1;
for (int i = 1; i <= l; i++)
{
hsh = (hsh * baza + v[i]) % mod;
if (i < l)
{
ptr = (ptr * baza) % mod;
}
}
for (int i = l + 1; i <= n + 1; i++)
{
m[hsh]++;
if (m[hsh] == k)
{
return true;
}
if (i == n + 1)
{
continue;
}
hsh -= (v[i - l] * ptr) % mod;
while (hsh < 0)
{
hsh += mod;
}
hsh = (hsh * baza + v[i]) % mod;
}
return false;
}
int main ()
{
in >> n >> k;
for (int i = 1; i <= n; i++)
{
char ch;
in >> ch;
v[i] = (ch - 'a') + 1;
}
int l = 1, r = n, ans = 0;
while (l <= r)
{
int m = (l + r) / 2;
if (check(m))
{
l = m + 1;
ans = m;
}
else
{
r = m - 1;
}
}
out << ans;
in.close();
out.close();
return 0;
}