Cod sursa(job #953236)
#include <cstdio>
#include <cstdlib>
#include <map>
#include <algorithm>
using namespace std;
#define Mod 66587
#define Nmax 16400
int C[Nmax], P[Nmax];
int N, K;
char S[Nmax];
map<int, int> Hash;
bool Check(int L)
{
Hash.clear();
for(int i = 1; i + L - 1 <= N; ++ i)
{
int SubC = (C[i + L - 1] - C[i - 1] * P[L] + Mod) % Mod;
Hash[SubC] ++;
if(Hash[SubC] >= K) return 1;
}
return 0;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int i;
scanf("%i %i\n", &N, &K);
gets(S + 1);
P[0] = 1;
for(i = 1; i <= N; ++ i)
P[i] = (P[i - 1] * 257) % Mod;
for(i = 1; i <= N; ++ i)
C[i] = (C[i - 1] * 257 + S[i]) % Mod;
int Left = 0, Right = N, Mid, Ans = -1;
while(Left <= Right)
{
Mid = (Left + Right) / 2;
if(Check(Mid)) Ans = Mid, Left = Mid + 1;
else Right = Mid - 1;
}
printf("%i\n", Ans);
return 0;
}