Pagini recente » Cod sursa (job #2574172) | Cod sursa (job #3243949) | Cod sursa (job #2140160) | Cod sursa (job #2102260) | Cod sursa (job #543722)
Cod sursa(job #543722)
#include<fstream>
#include<cstdio>
#include<algorithm>
#define MAXN 17000
using namespace std;
ifstream f1 ("substr.in");
ofstream f2 ("substr.out");
char A[MAXN];
struct entry
{
int nr[2], p;
} L[MAXN];
int P[20][MAXN], N,k, i, stp, cnt;
bool cmp(const entry &a, const entry &b)
{
if (a.nr[0]!=b.nr[0]) return a.nr[0]<b.nr[0];
else return a.nr[1]<b.nr[1];
}
int lcp (int a, int b)
{
int rez=0;
for (int i=stp-1; i>=0 && a<N&& b<N; --i)
if (P[i][a]==P[i][b])
a+=1<<i, b+=1<<i, rez+=1<<i;
return rez;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n",&N,&k);
fgets(A,17000,stdin);
for (stp = 1, cnt = 1; cnt >> 1 < N; ++stp, cnt <<= 1)
{
for (int i = 0; i < N; ++i)
{
L[i].nr[0] = P[stp - 1][i];
if (i+cnt<N) L[i].nr[1]= P[stp - 1][i + cnt];
else L[i].nr[1]= -1000000000;
L[i].p = i;
}
sort(L, L + N, cmp);
for (int i = 0; i < N; ++i)
if (i>0 && L[i].nr[0]==L[i - 1].nr[0]&&L[i].nr[1]==L[i - 1].nr[1])
P[stp][L[i].p]=P[stp][L[i - 1].p];
else P[stp][L[i].p]=i;
}
int val=0;
for (int i=0; i<=N-k; i++)
val=max (val, lcp(L[i].p,L[i+k-1].p));
if (val>N) val=N;
printf ("%d\n", val);
return 0;
}