Pagini recente » Cod sursa (job #2731847) | Cod sursa (job #307878) | Cod sursa (job #2683223) | Cod sursa (job #16272) | Cod sursa (job #933894)
Cod sursa(job #933894)
#include<algorithm>
#include<cstdio>
#include<cstring>
#define NMax 100005
using namespace std;
struct entry {
int nr[2],p;
} L[NMax];
int P[20][NMax],step,N;
char sir[NMax];
bool cmp (entry aa, entry bb)
{
return aa.nr[0]==bb.nr[0] ? (aa.nr[1]<bb.nr[1]) : (aa.nr[0]<bb.nr[0]);
}
int lcp (int x, int y)
{
int k,ret=0;
if (x==y)
return N-x;
for (k=step-1; k>=0 && x<N && y<N; k--)
if (P[k][x]==P[k][y])
x+=(1<<k), y+=(1<<k), ret+=(1<<k);
return ret;
}
int main ()
{
int i,cnt,maxi=0,k;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&N,&k);
scanf("%s",sir);
N=strlen(sir);
for (i=0; i<N; i++)
P[0][i]=sir[i]-'a';
for (step=1, cnt=1; cnt>>1 < N; step++, cnt<<=1)
{
for (i=0; i<N; i++)
{
L[i].nr[0]=P[step-1][i];
L[i].nr[1]=i+cnt<N ? P[step-1][i+cnt] : -1;
L[i].p=i;
}
sort(L,L+N,cmp);
for (i=0; i<N; i++)
P[step][L[i].p]=i>0 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1] ? P[step][L[i-1].p] : i;
}
for (i=0; i<=N-k; i++)
maxi=max(maxi,lcp(L[i].p,L[i+k-1].p));
printf("%d\n",maxi);
return 0;
}