Pagini recente » Cod sursa (job #971985) | Cod sursa (job #290289) | Cod sursa (job #1412780) | Cod sursa (job #1555962) | Cod sursa (job #218649)
Cod sursa(job #218649)
#include<cstdio>
#include<cstring>
#include<algorithm>
struct sit{
int nr[2],b;
}l[17000];
int i,j,mxa,n,v,p[25][17000],k,o;
char x[17000];
using namespace std;
bool cmp(const sit &a,const sit &b)
{
return (a.nr[0]==b.nr[0])?(a.nr[1]<b.nr[1]):(a.nr[0]<b.nr[0]);
}
int lcp(int f,int g)
{ int q,w=0;
if(f==g) return n-f;
for(q=k-1;q>0&&f<n&&g<n;--q)
if(p[q][f]==p[q][g])
{ f+=1<<q; g+=1<<q; w+=1<<q;}
return w;
}
int main()
{ freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&n,&v);
scanf("%s",&x);
for(i=0;i<n;i++)
p[0][i]=x[i]-'a';
for(k=1,j=1;j/2<n;j=j*2,++k)
{
for(i=0;i<n;++i)
{
l[i].nr[0]=p[k-1][i];
if(i+j<n)
l[i].nr[1]=p[k-1][i+j];
else l[i].nr[1]=-1;
l[i].b=i;
}
sort(l,l+n,cmp);
for(i=0;i<n;++i)
if(l[i].nr[0]==l[i-1].nr[0]&&l[i].nr[1]==l[i-1].nr[1])
p[k][l[i].b]=p[k][l[i-1].b];
else p[k][l[i].b]=i;
}
for(i=0;i<=n-v;i++)
{ o=lcp(l[i].b,l[i+v-1].b);
if(o>mxa)
mxa=o;
}
printf("%d",mxa);
return 0;
}