Pagini recente » Cod sursa (job #1372431) | Cod sursa (job #658863) | Cod sursa (job #2942331) | Istoria paginii runda/sim0004/clasament | Cod sursa (job #543698)
Cod sursa(job #543698)
#include <stdio.h>
#include <algorithm>
#define pii pair <int,int>
#define LMAX 16505
#define HMAX 18
#define INF 2000000000
#define pb push_back
#define f first
#define s second
using namespace std;
int n,k,r,B[HMAX][LMAX],ord[LMAX],cat,a,b,rez;
char A[LMAX];
pii C[LMAX];
bool comp1(int x,int y)
{
return A[x]<A[y];
}
bool comp2(int x,int y)
{
if (C[x].f<C[y].f)
return 1;
if (C[x].f>C[y].f)
return 0;
if (C[x].s<C[y].s)
return 1;
return 0;
}
void suffix_arrays()
{
int i,j,poz;
for (i=1; i<=n; i++)
ord[i]=i;
r=0;
sort(ord+1,ord+n+1,comp1);
B[0][ord[1]]=++r;
for (i=2; i<=n; i++)
if (A[ord[i]]==A[ord[i-1]])
B[0][ord[i]]=r;
else
B[0][ord[i]]=++r;
for (i=1; ; i++)
{
for (j=1; j<=n; j++)
{
C[j].f=B[i-1][j];
poz=j+(1<<(i-1));
C[j].s=poz>n ? INF : B[i-1][poz];
ord[j]=j;
}
sort(ord+1,ord+n+1,comp2);
r=0;
B[i][ord[1]]=++r;
for (j=2; j<=n; j++)
{
if (C[ord[j]].f==C[ord[j-1]].f && C[ord[j]].s==C[ord[j-1]].s)
B[i][ord[j]]=r;
else
B[i][ord[j]]=++r;
}
if ((1<<i)>n)
{
cat=i;
break ;
}
}
}
int lcp(int cat)
{
if (cat==-1)
return 0;
if (a>b || b>n)
return 0;
if (B[cat][a]==B[cat][b])
{
a+=1<<cat; b+=1<<cat;
return (1<<cat)+lcp(cat-1);
}
return lcp(cat-1);
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d\n",&n,&k);
fgets(A+1,LMAX,stdin);
suffix_arrays();
int i,l,v;
for (i=1; i<=n-k+1; i++)
{
a=ord[i]; b=ord[i+k-1];
v=min(n-a+1,n-b+1);
l=lcp(cat);
l=min(l,v);
if (l>rez) rez=l;
}
printf("%d\n",rez);
return 0;
}