Pagini recente » Cod sursa (job #557344) | Cod sursa (job #3156566) | Cod sursa (job #499554) | Cod sursa (job #374206) | Cod sursa (job #528834)
Cod sursa(job #528834)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Nmax 17000
#define x first
#define y second
using namespace std;
//struct sir
//{
// int nr1,nr2,poz;
//} b[Nmax];
int n,nr=0,i,j,a[25][Nmax],k,q,maxx,sol;
pair <pair <int, int>, int> b[Nmax];
char s[Nmax];
//bool cmp(sir x,sir y)
//{
// if ((x.nr1>y.nr1)||(x.nr1==y.nr1&&x.nr2>y.nr2)) return 0;
// return 1;
//}
int lcp(int x,int y)
{
int rez=0;
if (x==y) return n-x;
for (int i=nr;i>=0&&x<n&&y<n;i--)
if (a[i][x]==a[i][y])
{
rez+=1<<i;
x+=1<<i;
y+=1<<i;
}
return rez;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d\n",&n,&q);
fgets(s,n+3,stdin);
for (i=0;i<n;i++)
a[0][i]=s[i]-'a';
for (i=1;i*2<n;i=i*2)
{
for (k=0;k<n;k++)
{
b[k].x.x=a[nr][k];
if (k+i<n) b[k].x.y=a[nr][k+i];
else b[k].x.y=-1;
b[k].y=k;
}
sort(b,b+n);
nr++;
for (k=0;k<n;k++)
if (k!=0&&b[k].x.x==b[k-1].x.x&&b[k].x.y==b[k-1].x.y) a[nr][b[k].y]=a[nr][b[k-1].y];
else a[nr][b[k].y]=k;
}
for (i=0;i<=n-q;i++)
{
sol=lcp(b[i].y,b[i+q-1].y);
if (sol>maxx) maxx=sol;
}
printf("%d\n",maxx);
return 0;
}