Pagini recente » Cod sursa (job #1867359) | Cod sursa (job #522942) | Cod sursa (job #827884) | Cod sursa (job #712799) | Cod sursa (job #354595)
Cod sursa(job #354595)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 20000
#define mlog 15
struct sufix
{
long d[2];
long poz;
};
long n, i, j, k, l, np, sol, aux, x, y;
char c[maxn], pas[mlog][maxn], ind[maxn];
sufix v[maxn];
inline int cmp(sufix a, sufix b)
{
if(a.d[0]<b.d[0]) return 1;
if(a.d[0]>b.d[0]) return 0;
return a.d[1]<b.d[1];
}
inline int cmp2(long a, long b)
{
return pas[np][a]<pas[np][b];
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d%d\n", &n, &k);
for(i=1; i<=n; i++)
{
scanf("%c", &c[i]);
pas[0][i]=c[i]-'0';
}
for(i=1, l=1; l/2<=n; i++, l*=2)
{
for(j=1; j<=n; j++)
{
v[j].d[0]=pas[i-1][j];
if(j+l<=n)
{
v[j].d[1]=pas[i-1][j+l];
}
else
{
v[j].d[1]=-1;
}
v[j].poz=j;
}
sort(v+1, v+n+1, cmp);
for(j=1; j<=n; j++)
{
if(j>1 && v[j].d[0]==v[j-1].d[0] && v[j].d[1]==v[j-1].d[1])
{
pas[i][v[j].poz]=pas[i][v[j-1].poz];
}
else
{
pas[i][v[j].poz]=j;
}
}
}
np=i-1;
for(i=1; i<=n; i++)
{
ind[pas[np][i]]=i;
}
sol=0;
for(i=1; i<=n-k+1; i++)
{
aux=0;
x=ind[i];
y=ind[i+k-1];
for(j=np; j>=0 && x<=n && y<=n; j--)
{
if(pas[j][x]==pas[j][y])
{
aux+=1<<j;
x+=1<<j;
y+=1<<j;
}
}
if(aux>sol)
sol=aux;
}
printf("%d\n", sol);
return 0;
}