Pagini recente » Cod sursa (job #1850817) | Cod sursa (job #1344300) | Cod sursa (job #1047971) | Cod sursa (job #1094295) | Cod sursa (job #2794584)
#include <bits/stdc++.h>
#define P 33333331
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
unordered_map<int, int> M;
char text[16400];
int n, k, p62[16385]; ///p62[i] = 52^i
void Make62()
{
p62[0] = 1;
for (int i = 1; i <= 16384; i++)
p62[i] = 1LL * p62[i - 1] * 62 % P;
}
int Code(char c)
{
if (c <= '9') return c - '0';
if (c <= 'Z') return c - 'A' + 10;
return c - 'a' + 36;
}
bool Verif(int L)
{
M.clear();
int i, x = 0, e;
e = p62[L - 1];
///formez primul sir de lungime L, modulo P
for (i = 0; i < L; i++)
x = (1LL * x * 62 + Code(text[i])) % P;
M[x]++;
for (; text[i] != 0; i++)
{
x = ((x - 1LL * Code(text[i - L]) * e % P + P) * 62 + Code(text[i])) % P;
M[x]++;
if (M[x] >= k) return 1;
}
return 0;
}
/// Cauta lungimea maxima L pe care o poate avea o secv care apare de cel putin k ori in text
int CautBin()
{
int st, dr, L, mid;
st = 1;
L = dr = n - k + 1;
while (st <= dr)
{
mid = (st + dr) / 2;
if (Verif(mid))
{
L = mid;
st = mid + 1;
}
else dr = mid - 1;
}
return L;
}
int main()
{
Make62();
fin >> n >> k;
fin >> text;
fout << CautBin();
fout.close();
return 0;
}