Pagini recente » Cod sursa (job #2139235) | Cod sursa (job #2397114) | Cod sursa (job #2856534) | Cod sursa (job #3211895) | Cod sursa (job #529196)
Cod sursa(job #529196)
#include <stdio.h>
#include <algorithm>
#define Nmax 16500
#define Maxlg 17
using namespace std;
struct substr{
int i0,i1,i;
inline bool operator <( const substr &o ) const{
return ( i0 == o.i0 ? (i1 < o.i1) : i0<o.i0 );
}
inline bool operator ==( const substr &o ) const{
return ( i0==o.i0 && i1==o.i1 );
}
} L[Nmax];
int P[Maxlg][Nmax];
char s[Nmax];
int N,K,pmx;
inline int Maxim(int x,int y){ return x>y ? x:y; }
inline int prefix_comun(int a,int b){
int p,rez=0;
for(p=pmx; p>=0 && a<N && b<N; --p)
if( P[p][a] == P[p][b] ){
a += (1<<p);
b += (1<<p);
rez += (1<<p);
}
return rez;
}
int main(){
int i,j,step,rez=0;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d\n",&N,&K);
fgets(s,Nmax,stdin);
for(i=0;i<N;++i)
P[0][i]=s[i]-'a';
for(pmx=0; (1<<pmx) < N; ) pmx++;
pmx--;
for( j=1, step=1<<(j-1); step <N; ++j, step=1<<(j-1) ){
for(i=0;i<N;++i){
L[i].i0=P[j-1][i];
L[i].i1= i+step<N ? P[j-1][i+step] : -1;
L[i].i=i;
}
sort(L,L+N);
for(i=0;i<N;++i)
if( i && L[i] == L[i-1] ) P[j][L[i].i]=P[j][L[i-1].i];
else P[j][L[i].i]=i;
}
for(i=0;i<=N-K;++i)
rez=Maxim(rez, prefix_comun(L[i].i,L[i+K-1].i) );
printf("%d\n",rez);
fclose(stdin); fclose(stdout);
return 0;
}