Pagini recente » Cod sursa (job #2082356) | Cod sursa (job #158129) | Cod sursa (job #251284) | Cod sursa (job #912006) | Cod sursa (job #1990007)
#include<cstdio>
#include<algorithm>
#include<utility>
#define P 15
#define N (1<<P)
using namespace std;
int suf[P+1][N+1];
pair<pair<int,int>,int> v[N+1];
char s[N+1];
int n;
void solve(){
int i,j;
for(i=0;i<n;i++)
suf[0][i+1]=s[i];
for(i=1;i<P;i++){
for(j=1;j<=n;j++)
v[j]={{suf[i-1][j],suf[i-1][j+(1<<(i-1))]},j};
sort(v+1,v+n+1);
for(j=1;j<=n;j++)
suf[i][v[j].second]=suf[i][v[j-1].second]+(v[j].first!=v[j-1].first);
}
}
int lcp(int i,int j){
int r=0,p=P-1;
while(p>=0 &&i<=n &&j<=n){
if (suf[p][i]==suf[p][j]){
i+=(1<<p);
j+=(1<<p);
r+=(1<<p);
}
p--;
}
return r;
}
int main(){
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
int k,i;
scanf ("%d%d\n",&n,&k);
gets(s);
solve();
int ans=0;
for(i=1;i+k-1<=n;i++)
ans=max(ans,lcp(v[i].second,v[i+k-1].second));
printf ("%d",ans);
return 0;
}