Pagini recente » Cod sursa (job #1294238) | Cod sursa (job #2074732) | Cod sursa (job #387574) | Cod sursa (job #1954850) | Cod sursa (job #220119)
Cod sursa(job #220119)
#include <stdio.h>
const int MOD = 666013;
int N, K, f[700000], p[17005];
char s[17005];
void precalculez()
{
p[0] = 1;
for (int i = 1; i <= N; i++) p[i] = (p[i - 1] * 71) % MOD;
}
void init()
{
for (int i = 0; i <= 666013; i++) f[i] = 0;
}
int solve(int X)
{
int i, x = 0, max = 0;
for (i = 0; i < X; i++) x = ( x + ((s[i] - 'a') * p[X - i - 1]) % MOD) % MOD;
f[x]++;
if (max < f[x]) max = f[x];
for (; i < N; i++)
{
x -= ((s[i - X] - 'a') * p[X - 1]) % MOD;
x = x % MOD;
while (x < 0) x += MOD;
x *= 71;
x = x % MOD;
x += (s[i] - 'a');
x = x % MOD;
f[x]++;
if (max < f[x]) max = f[x];
}
if (max >= K) return 1;
return 0;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
int rez = 0;
scanf("%d %d",&N,&K);
scanf("%s",s);
precalculez();
int p, u, m, x1, x2;
p = 1; u = N;
while (p <= u)
{
m = (p + u) / 2;
init();
x1 = solve(m);
init();
x2 = solve(m + 1);
if (x1 && !x2)
{
rez = m;
break;
}
else if (x2)
{
p = m + 1;
}
else if (!x1)
{
u = m - 1;
}
}
printf("%d\n",rez);
return 0;
}