Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 117 si 116 | Cod sursa (job #2572966) | Cod sursa (job #886866) | Cod sursa (job #1790533) | Cod sursa (job #1482115)
#include<cstdio>
#include<algorithm>
using namespace std;
char si[17000];
int pf[22][17000];
struct sp
{
int pre,nex,pos;
} ve[17000];
bool cmp(sp a1,sp a2)
{
if(a1.pre!=a2.pre)
return a1.pre<a2.pre;
return a1.nex<a2.nex;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
int n,k,i,j,lg,cn,la,a,b,x,p2;
scanf("%d%d\n",&n,&k);
gets(si+1);
if(n==1)
{
if(k==1)
printf("1\n");
else
printf("0\n");
return 0;
}
for(i=1; i<=n; i++)
{
if(si[i]>='a' && si[i]<='z')
si[i]=si[i]-'a'+1;
else if(si[i]>='A' && si[i]<='Z')
{
si[i]=si[i]-'A'+30;
}
else
si[i]=si[i]-'0'+60;
pf[0][i]=si[i];
}
lg=1;
for(cn=1; (cn>>1)<=n; lg++,(cn<<=1))
{
for(i=1; i<=n; i++)
{
ve[i].pre=pf[lg-1][i];
ve[i].nex=pf[lg-1][i+cn];
ve[i].pos=i;
}
sort(ve+1,ve+n+1,cmp);
for(i=1; i<=n; i++)
{
if(i>1 && ve[i].pre==ve[i-1].pre && ve[i].nex==ve[i-1].nex)
pf[lg][ve[i].pos]=pf[lg][ve[i-1].pos];
else
pf[lg][ve[i].pos]=i;
}
}
lg--;
la=0;
for(i=n-k+1; i>=1; i--)
{
a=ve[i].pos;
b=ve[i+k-1].pos;
x=0;
p2=(1<<lg);
for(j=lg; j>=0; j--)
{
if(a+p2-1<=n && b+p2-1<=n)
{
if(pf[j][a]==pf[j][b])
{
a=a+p2;
b=b+p2;
x=x+p2;
}
}
p2=p2/2;
}
if(x>la)
la=x;
}
printf("%d\n",la);
return 0;
}