Pagini recente » Cod sursa (job #279567) | Cod sursa (job #1500081) | Cod sursa (job #1789129) | Cod sursa (job #1585050) | Cod sursa (job #1223326)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
struct entry
{
int st,dr,poz;
} Q[16400];
char s[16400];
int n,k,minim,maxim,stp,poz[16400],P[16][16400];
bool cmp(entry A, entry B)
{
if (A.st==B.st)
return (A.dr<B.dr);
return (A.st<B.st);
}
int lcp(int x, int y)
{
int i,r=0;
if (x==y) return n-x;
for (i=stp;i>=0 && x<n && y<n;--i)
if (P[i][x]==P[i][y])
x+=1<<i, y+=1<<i, r+=1<<i;
return r;
}
int main()
{
int i,j;
fin>>n>>k>>s;
minim=s[0];
for (i=1;s[i];++i)
if (s[i]<minim) minim=s[i];
for (i=0;i<n;++i)
P[0][i]=s[i]-minim;
for (i=1;(1<<(i-1))<n;++i)
{
for (j=0;j<n;++j)
{
Q[j].st=P[i-1][j], Q[j].dr=0;
if (j+(1<<(i-1))<n) Q[j].dr=P[i-1][j+(1<<(i-1))];
Q[j].poz=j;
}
sort(Q,Q+n,cmp);
P[i][Q[0].poz]=0;
for (j=1;j<n;++j)
if (Q[j].st==Q[j-1].st && Q[j].dr==Q[j-1].dr)
P[i][Q[j].poz]=P[i][Q[j-1].poz];
else
P[i][Q[j].poz]=1+P[i][Q[j-1].poz];
}
stp=i-1;
for (i=0;i<n;++i)
poz[i]=Q[i].poz;
for (i=0;i+k<=n;++i)
maxim=max(maxim,lcp(poz[i],poz[i+k-1]));
fout<<maxim<<"\n";
return 0;
}