Pagini recente » Cod sursa (job #2987735) | Cod sursa (job #1266663) | Cod sursa (job #2627014) | Cod sursa (job #2768724) | Cod sursa (job #420534)
Cod sursa(job #420534)
#include <algorithm>
using namespace std;
#define DIM 16390
#define LOG 15
struct suffix {int l1,l2,i;} v[DIM];
int p[LOG][DIM];
char buff[DIM];
int n,m,k,sol;
int ord[DIM];
struct cmp
{
bool operator () (const suffix &a,const suffix &b) const
{
return a.l1<b.l1 || (a.l1==b.l1 && a.l2<b.l2);
}
};
inline int lcp (int x,int y)
{
int i,nrt;
if (x==y)
return n-x;
for (nrt=0, i=m; i>=0 && x<n && y<n; --i)
if (p[i][x]==p[i][y])
{
x+=(1<<i);
y+=(1<<i);
nrt+=(1<<i);
}
return nrt;
}
void solve ()
{
int i,j;
for (i=0; i<n; ++i)
p[0][i]=buff[i]-'a';
for (i=m=1; (i>>1)<n; ++m, i<<=1)
{
for (j=0; j<n; ++j)
{
v[j].l1=p[m-1][j];
if (i+j<n)
v[j].l2=p[m-1][i+j];
else
v[j].l2=-1;
v[j].i=j;
}
sort (v,v+n,cmp ());
for (j=0; j<n; ++j)
if (j>0 && v[j].l1==v[j-1].l1 && v[j].l2==v[j-1].l2)
p[m][v[j].i]=p[m][v[j-1].i];
else
p[m][v[j].i]=j;
}
--m;
for (i=0; i<n; ++i)
ord[p[m][i]]=i;
for (i=0; i<n-k; ++i)
sol=max (sol,lcp (ord[i],ord[i+k-1]));
printf ("%d",sol);
}
int main ()
{
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
scanf ("%d%d\n",&n,&k);
fgets (buff,DIM,stdin);
solve ();
return 0;
}