Pagini recente » Istoria paginii runda/sim_pm1/clasament | Cod sursa (job #1417070) | Cod sursa (job #1796246) | Cod sursa (job #1290224) | Cod sursa (job #1837985)
#include <bits/stdc++.h>
#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 sa[maxLog][maxN]; ///suffix array
int n,i,j,len,loga,k,sol;
void build_suffixArray()
{
int i,j;
for(i=0;i<len;i++)
sa[0][i]=str[i];
for(loga=1;(1<<loga)<len;loga++)
{
for(j=0;j<len;j++)
{
l[j].pos=j;
l[j].nr1=sa[loga-1][j];
if(j+(1<<loga-1)<len)
l[j].nr2=sa[loga-1][j+(1<<loga-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)
sa[loga][l[j].pos]=sa[loga][l[j-1].pos];
else sa[loga][l[j].pos]=j;
}
--loga;
}
int lcp(int x,int y)
{
int p,res=0;
if(x==y)
return len-x;
for(p=loga-1;p>=0 && x<len && y<len;p--)
if(sa[p][x]==sa[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;
}