Pagini recente » Cod sursa (job #2044951) | Cod sursa (job #751243) | Cod sursa (job #314716) | Cod sursa (job #1696971) | Cod sursa (job #1227842)
#include <cstdio>
#include <algorithm>
#define Nmax 17000
using namespace std;
int N,K,dp[20][Nmax];
char a[Nmax];
struct el
{
int val1,val2,poz;
bool operator < (const el &A) const
{
if(val1==A.val1) return val2<A.val2;
return val1<A.val1;
}
};
el L[Nmax];
int len;
inline void Suffix_Arrays()
{
int i,j;
el w;
for(i=1;i<=N;++i)
dp[0][i]=a[i]-'0';
for(i=1;1<<(i-1)<N;++i)
{
len=0;
for(j=1;j<=N;++j)
{
w.val1=dp[i-1][j];
if(j+(1<<(i-1))>N) w.val2=-1;
else w.val2=dp[i-1][j+(1<<(i-1))];
w.poz=j;
L[++len]=w;
}
sort(L+1,L+len+1);
dp[i][L[1].poz]=0;
for(j=2;j<=len;++j)
if(L[j].val1==L[j-1].val1 && L[j].val2==L[j-1].val2)
dp[i][L[j].poz]=dp[i][L[j-1].poz];
else
dp[i][L[j].poz]=dp[i][L[j-1].poz]+1;
}
}
inline int LCP(int p1, int p2)
{
int i=p1,j=p2,k;
for(k=0;p1+(1<<k)-1<=N && p2+(1<<k)-1<=N;++k);
--k;
for(;k && i<N && j<N;--k)
if(dp[k][i]==dp[k][j])
{
i+=(1<<k); j+=(1<<k);
}
return i-p1;
}
int main()
{
int i,sol=0;
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
scanf("%d%d%s", &N,&K,(a+1));
Suffix_Arrays();
for(i=1;i+K-1<=N;++i) sol=max(sol,LCP(L[i].poz,L[i+K-1].poz));
printf("%d\n", sol);
return 0;
}