Pagini recente » Cod sursa (job #1608817) | Cod sursa (job #54529) | Cod sursa (job #1038290) | Cod sursa (job #2587925) | Cod sursa (job #717348)
Cod sursa(job #717348)
#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)
w[i]=lcp(L[i].i,L[i+1].i);
for(int i=2;i<=20000;++i)
P[i]=P[i/2]+1;
pp[0]=1;
for(int i=1;i<=15;++i)
pp[i]=pp[i-1]*2;
for(int i=1;i<=n;++i)
{
a[i][0]=2000000000;
a[i][1]=w[i];
}
for(int j=2;j<=P[n];++j)
for(int i=1;i<=n;++i)
a[i][j]=min(a[i][j-1],a[i+pp[j-1]][j-1]);
for(int i=1;i+k-2<n;++i)
{
x=i;
y=i+k-2;
z=min(a[x][P[y-x+1]],a[y-pp[P[y-x+1]]+2][P[y-x+1]]);
if(z>maxx)
maxx=z;
}
fprintf(g,"%d",maxx);
}
fclose(f);
fclose(g);
return 0;
}