Pagini recente » Cod sursa (job #1148358) | Cod sursa (job #35421) | Cod sursa (job #1756796) | Cod sursa (job #1927378) | Cod sursa (job #543711)
Cod sursa(job #543711)
#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 (int i=0; i<N; i++) P[0][i]=A[i]-'a';
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]= -1;
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));
printf ("%d\n", val);
return 0;
}