Pagini recente » Cod sursa (job #2058838) | Cod sursa (job #1769268) | Cod sursa (job #2849092) | Cod sursa (job #488678) | Cod sursa (job #2794235)
#include <bits/stdc++.h>
#define P 20333353
#define Q 777013
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;
unordered_map <int, int> W;
char text[16400];
int n, k, p62[16385]; /// p62[i] = 62 ^ i
int q62[16385];
void Make62 ()
{
p62[0] = q62[0] = 1;
for (int i = 1; i <= 16384; i++)
{
p62[i] = p62[i - 1] * 62 % P;
q62[i] = q62[i - 1] * 62 % Q;
}
}
inline 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, y = 0, cod, i;
for (i = 0; i < L; i++)
{
cod = Cod(text[i]);
x = (x * 62 + cod) % P;
y = (y * 62 + cod) % Q;
}
M[x]++;
W[y]++;
if (M[x] >= k && W[y] >= k)
return 1;
for ( ;text[i]; i++)
{
x = ((x - Cod(text[i - L]) * p62[L - 1] % P + P) * 62 % P + Cod(text[i])) % P;
y = ((y - Cod(text[i - L]) * q62[L - 1] % Q + Q) * 62 % Q + Cod(text[i])) % Q;
M[x]++;
W[y]++;
if (M[x] == k && W[y] == 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;
}