Pagini recente » Cod sursa (job #933086) | Cod sursa (job #2128767) | Cod sursa (job #1266438) | Cod sursa (job #777201) | Cod sursa (job #1465025)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF -99999
#define nmax 17000
using namespace std;
int N,dp[nmax][21];
char s[nmax];
struct Coord{
int l,r,poz;
}V[nmax];
inline bool cmp(const Coord A , const Coord B){
if(A.l == B.l && A.r == B.r)
return false;
if(A.l == B.l)
return A.r < B.r;
return A.l < B.l;
}
inline int LCP(int x,int y){
int i,sol = 0,k,j;
j = N - max(x,y);
for(k = 0; (1<<k) <= j; ++k);
--k;
for(i = k; i >= 0 && x <= N && y <= N; --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 dinamica(){
int i,j;
for(i = 1; i <= N; ++i)
dp[i][0] = s[i] - 'a';
for(j = 1; (1<<(j-1)) <= N; ++j){
for(i = 1; i <= N; ++i){
V[i].l = dp[i][j-1];
if(i + (1<<(j-1)) > N)
V[i].r = INF;
else V[i].r = dp[i+(1<<(j-1))][j-1];
V[i].poz = i;
}
sort(V+1,V+N+1,cmp);
for(i = 1; i <= N; ++i){
dp[V[i].poz][j] = dp[V[i-1].poz][j]+1;
if(V[i].l == V[i-1].l && V[i].r == V[i-1].r)
--dp[V[i].poz][j];
}
}
}
int main(){
int i,sol=0,k;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d\n%s",&N,&k,s+1);
dinamica();
for(i = 1; i <= N-k + 1; ++i)
sol = max(sol , LCP(V[i].poz , V[i+k-1].poz));
printf("%d\n",sol);
return 0;
}