Pagini recente » Cod sursa (job #1896463) | Cod sursa (job #838113) | Cod sursa (job #175372) | Cod sursa (job #2055684) | Cod sursa (job #718470)
Cod sursa(job #718470)
#include<stdio.h>
#include<algorithm>
using namespace std;
FILE*f=fopen("substr.in","r");
FILE*g=fopen("substr.out","w");
int x,y,z,maxx,P[20001],pp[22],a[20001][17],n,k,p[16][16400],cnt,stp,w[16400];
char v[16400];
struct sir
{
int i1,i2,i;
}L[16400];
int cmp(sir a,sir b)
{
if(a.i1==b.i1)
return a.i2<b.i2;
return a.i1<b.i1;
}
int lcp(int x,int y)
{
int k,sol=0;
for(k=stp-1;k>=0&&x<=n&&y<=n;--k)
if(p[k][x]==p[k][y])
{
x+=1<<k;
y+=1<<k;
sol+=1<<k;
}
return sol;
}
int main()
{
fscanf(f,"%d%d\n",&n,&k);
fscanf(f,"%s",v+1);
if(k==1)
fprintf(g,"%d",n);
else
{
for(int i=1;i<=n;++i)
p[0][i]=v[i];
int nr;
for(stp=1,cnt=1;cnt>>1<=n;++stp,cnt<<=1)
{
for(int i=1;i<=n;++i)
{
L[i].i1=p[stp-1][i];
if(i+cnt<=n)
L[i].i2=p[stp-1][i+cnt];
L[i].i=i;
}
sort(L+1,L+n+1,cmp);
nr=0;
for(int i=1;i<=n;++i)
if((L[i].i1==L[i-1].i1)&&(L[i].i2==L[i-1].i2))
p[stp][L[i].i]=nr;
else
p[stp][L[i].i]=++nr;
}
for(int i=1;i<n;++i)
{
int xx=lcp(L[i].i,L[i+k-1].i);
if(xx>maxx)
maxx=xx;
}
fprintf(g,"%d",maxx);
}
fclose(f);
fclose(g);
return 0;
}