Pagini recente » Cod sursa (job #578855) | Cod sursa (job #1879592) | Cod sursa (job #2387907) | Cod sursa (job #2647312) | Cod sursa (job #1944151)
#include <cstdio>
#include <algorithm>
#define maxN 16500
#define maxLog 16
using namespace std;
struct nod
{
int nr1,nr2,pos;
}L[maxN];
bool cmp(const nod &a,const nod &b)
{
if(a.nr1==b.nr1)
return a.nr2<b.nr2;
return a.nr1<b.nr1;
}
char str[maxN];
int P[maxLog][maxN]; ///suffix array
int n,i,j,len,log,k,sol;
void build_suffixArray()
{
int i,j;
for(i=0;i<len;i++)
P[0][i]=str[i];
for(log=1;(1<<log)<len;log++)
{
for(j=0;j<len;j++)
{
L[j].pos=j;
L[j].nr1=P[log-1][j];
if(j + (1<<log-1) < len)
L[j].nr2=P[log-1][j + (1<<log-1)];
else L[j].nr2=-1;
}
sort(L,L+len,cmp);
for(j=0;j<len;j++)
if(j && L[j].nr1==L[j-1].nr1 && L[j].nr2==L[j-1].nr2)
P[log][L[j].pos]=P[log][L[j-1].pos];
else P[log][L[j].pos]=j;
}
--log;
}
int lcp(int x,int y)
{
int p,res=0;
if(x==y)
return len-x;
for(p=log-1; p >= 0 && x < len && y < len; --p)
if(P[p][x] == P[p][y]){
res += (1<<p);
x += (1<<p);
y += (1<<p);
}
return res;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n",&len,&k);
gets(str);
build_suffixArray();
for(i=0;i<len-k;i++)
sol=max(sol,lcp(L[i].pos,L[i+k-1].pos));
printf("%d",sol);
return 0;
}