Pagini recente » Cod sursa (job #1413655) | Istoria paginii runda/lotj1 | Istoria paginii runda/532/clasament | Cod sursa (job #969996) | Cod sursa (job #1608734)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define NMAX 16400
using namespace std;
int n,k;
char ch[2*NMAX];
int suffix[NMAX][15],vec[NMAX],l2[NMAX];
struct str
{
int left;
int right;
int p;
}v[NMAX];
int comp(str a,str b)
{
if(a.left!=b.left) return a.left<b.left;
return a.right<b.right;
}
int comp2(int a,int b)
{
return suffix[a][l2[n]]<suffix[b][l2[n]];
}
int prefix(int p1,int p2)
{
if(p1==p2) return n-p1+1;
int m=l2[n];
int rasp=0;
for(;m>=0;m--)
{
if(suffix[p1+rasp][m]==suffix[p2+rasp][m])
{
rasp+=(1<<m);
}
}
return rasp;
}
int main()
{
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
for(int i=2;i<NMAX;i++)
{
l2[i]=l2[i-1];
if((i&(i-1))==0) ++l2[i];
}
scanf("%d%d%c",&n,&k,&ch[0]);
scanf("%s",ch);
if(k==1)
{
printf("%d\n",n);
return 0;
}
int maxim=0;
for(int i=0;i<n;i++) suffix[i][0]=(int)ch[i];
for(int j=1;j<=l2[n];j++)
{
for(int i=0;i<n;i++)
{
v[i].left=suffix[i][j-1];
if(i+(1<<(j-1))>=n) v[i].right=-1;
else v[i].right=suffix[i+(1<<(j-1))][j-1];
v[i].p=i;
}
sort(v,v+n,comp);
int ct=1;
suffix[v[0].p][j]=ct;
for(int i=1;i<n;i++)
{
if(v[i].left!=v[i-1].left||v[i].right!=v[i-1].right) ++ct;
suffix[v[i].p][j]=ct;
}
}
/* for(int j=0;j<=l2[n];j++)
{
for(int i=0;i<n;i++) printf("%d ",suffix[i][j]);
printf("\n");
}*/
for(int i=0;i<n;i++) vec[i]=i;
sort(vec,vec+n,comp2);
for(int i=0;i+k-1<n;i++)
{
int pr=prefix(v[i].p,v[i+k-1].p);
// for(int j=vec[i];j<n;j++) printf("%c",ch[j]);
// printf("\n");
// for(int j=vec[i+k-1];j<n;j++) printf("%c",ch[j]);
// printf("\n%d\n",pr);
if(maxim<pr) maxim=pr;
}
printf("%d\n",maxim);
}