Pagini recente » Cod sursa (job #1964590) | Cod sursa (job #1960746) | Cod sursa (job #1499540) | Cod sursa (job #1791849) | Cod sursa (job #2794579)
#include <bits/stdc++.h>
#define P 33333331
using namespace std;
/**
0-9
A-Z : 10...35
a-z : 36...61
*/
ifstream fin("substr.in");
ofstream fout("substr.out");
unordered_map <int, int> M;
char text[16400];
int n, k, p62[16385]; /// p62[i] = 62 ^ i
void Make62()
{
p62[0] = 1;
for (int i = 1; i <= 16384; i++)
p62[i] = 1LL * p62[i - 1] * 62 % P;
}
int Cod(char c)
{
if (c <= '9')
return c - '0';
if (c >= 'A' && c <= 'Z')
return 10 + c - 'A';
return 36 + c - 'a';
}
int Verifica(int L)
{
M.clear();
int x = 0, cod, i;
for (i = 0; i < L; i++)
{
cod = Cod(text[i]);
x = (1LL * x * 62 + cod) % P;
}
M[x]++;
if (M[x] >= k)
return 1;
for (; text[i]; i++)
{
x = ((x - 1LL * Cod(text[i - L]) * p62[L - 1] % P + P) * 62 % P + Cod(text[i])) % P;
M[x]++;
if (M[x] >= k)
return 1;
}
return 0;
}
int CautBin()
{
int st, dr, L, mid;
st = 1;
L = 0;
dr = n - k + 1;
while (st <= dr)
{
mid = (st + dr) / 2;
if (Verifica(mid))
{
L = mid;
st = mid + 1;
}
else dr = mid - 1;
}
return L;
}
int main()
{
fin >> n >> k;
fin >> text;
Make62();
fout << CautBin() << "\n";
return 0;
}