Pagini recente » Cod sursa (job #641243) | Cod sursa (job #403397) | Cod sursa (job #672457) | Cod sursa (job #2141879) | Cod sursa (job #528829)
Cod sursa(job #528829)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Nmax 17000
using namespace std;
struct sir
{
int nr1,nr2,poz;
} b[Nmax];
int n,nr=0,i,j,a[20][Nmax],k,q,maxx,sol;
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);
gets(s);
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].nr1=a[nr][k];
if (k+i<n) b[k].nr2=a[nr][k+i];
else b[k].nr2=-1;
b[k].poz=k;
}
sort(b,b+n,cmp);
nr++;
for (k=0;k<n;k++)
if (k!=0&&b[k].nr1==b[k-1].nr1&&b[k].nr2==b[k-1].nr2) a[nr][b[k].poz]=a[nr][b[k-1].poz];
else a[nr][b[k].poz]=k;
}
for (i=0;i<=n-q;i++)
{
sol=lcp(b[i].poz,b[i+q-1].poz);
if (sol>maxx) maxx=sol;
}
printf("%d\n",maxx);
return 0;
}