Pagini recente » Cod sursa (job #835116) | Cod sursa (job #2554555) | Cod sursa (job #124689) | Cod sursa (job #2026975) | Cod sursa (job #1300404)
#include <cstdio>
#include <algorithm>
#define Nmax 17000
using namespace std;
struct el
{
int v1,v2,poz;
bool operator <(const el &A) const
{
if(v1==A.v1) return v2<A.v2;
return v1<A.v1;
}
};
el v[Nmax];
int n,k,dp[Nmax][20];
char a[Nmax];
inline int LCP(int x, int y)
{
int i,sol=0;
for(i=19;i>=0;--i)
{
if(x+(1<<i)-1>n || y+(1<<i)-1>n) continue;
if(dp[x][i]==dp[y][i])
{
sol+=(1<<i);
x+=(1<<i);
y+=(1<<i);
}
}
return sol;
}
inline void SuffixArrays()
{
int i,j;
for(i=1;i<=n;++i)
dp[i][0]=a[i]-'A';
for(j=1;(1<<(j-1))<n;++j)
{
for(i=1;i<=n;++i)
{
v[i].poz=i;
v[i].v1=dp[i][j-1];
if(i+(1<<(j-1))>n) v[i].v2=-1;
else v[i].v2=dp[i+(1<<(j-1))][j-1];
}
sort(v+1,v+n+1);
dp[v[1].poz][j]=0;
for(i=2;i<=n;++i)
if(v[i].v1==v[i-1].v1 && v[i].v2==v[i-1].v2) dp[v[i].poz][j]=dp[v[i-1].poz][j];
else dp[v[i].poz][j]=dp[v[i-1].poz][j]+1;
}
}
int main()
{
int sol=0,i,k;
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
scanf("%d%d%s", &n,&k,(a+1));
SuffixArrays();
for(i=1;i<=n-k+1;++i)
sol=max(sol,LCP(v[i].poz,v[i+k-1].poz));
printf("%d\n", sol);
}