Pagini recente » Rating Blanaru Paul (paul.blanaru) | Cod sursa (job #2370895) | Cod sursa (job #2385738) | Cod sursa (job #1619417) | Cod sursa (job #756895)
Cod sursa(job #756895)
#include <cstdio>
#include <map>
#include <algorithm>
#define D 62
#define NMax 17000
using namespace std;
const int U[2]={666013, 1000003};
map < pair <int, int>, int > H;
int N, K, P[2][NMax], S[NMax], CurrentK, Solution;
void ComputeP ()
{
P[0][0]=P[1][0]=1;
for (int i=1; i<=N; ++i)
{
for (int j=0; j<2; ++j) P[j][i]=(D*P[j][i-1])%U[j];
}
}
inline void Insert (int HV[2])
{
if (H.find (make_pair (HV[0], HV[1]))!=H.end ())
{
++H[make_pair (HV[0], HV[1])];
}
else H[make_pair (HV[0], HV[1])]=1;
CurrentK=max (CurrentK, H[make_pair (HV[0], HV[1])]);
}
inline int Count (int L)
{
CurrentK=0;
int HV[2]={0, 0};
for (int i=0; i<L; ++i)
{
for (int j=0; j<2; ++j) HV[j]=(HV[j]*D+S[i])%U[j];
}
Insert (HV);
for (int i=L; i<N; ++i)
{
for (int j=0; j<2; ++j)
{
HV[j]=((HV[j]-(P[j][L-1]*S[i-L])%U[j]+U[j])*D+S[i])%U[j];
}
Insert (HV);
}
H.clear ();
return CurrentK;
}
void BSearch ()
{
int L=0, R=N;
while (L<=R)
{
int Mid=(L+R)/2;
if (Count (Mid)>=K) Solution=Mid, L=Mid+1;
else R=Mid-1;
}
}
void Solve ()
{
ComputeP ();
BSearch ();
}
inline int Convert (char X)
{
if (X<='9') return X-'0';
if (X<='Z') return X-'A'+10;
if (X<='z') return X-'a'+36;
}
void Read ()
{
freopen ("substr.in", "r", stdin);
scanf ("%d %d\n", &N, &K);
for (int i=0; i<N; ++i)
{
char C; scanf ("%c", &C); S[i]=Convert (C);
}
}
void Print ()
{
freopen ("substr.out", "w", stdout);
printf ("%d\n", Solution);
}
int main ()
{
Read ();
Solve ();
Print ();
return 0;
}