Pagini recente » Cod sursa (job #3126286) | Cod sursa (job #1314303) | Cod sursa (job #2750725) | Cod sursa (job #1005875) | Cod sursa (job #1223575)
#include <fstream>
#include <cstring>
#include <algorithm>
#define DIM 16384
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n,k,stp;
int a[19][DIM];
char A[DIM];
struct suf{
int st,dr,poz;
}L[DIM];
int cmp(suf a,suf b){
if(a.st>b.st)
return 0;
else if(a.st==b.st)
if(a.dr>b.dr)
return 0;
return 1;
}
int prefix(int x,int y){
int lenght=0,t=0;
if(x==y) return n-x;
for(t=stp;t>=0 && x<n && y<n;t--){
if(a[t][x]==a[t][y])
x+=1<<t,y+=1<<t,lenght+=1<<t;
}
return lenght;
}
int main(void){
register int i,j,jv,x,q;
f>>n>>k;
f>>A;
for(i=0;A[i];i++) a[0][i]=A[i]-'a';
for(i=1;(1<<(i-1))<n;i++){
for(j=0;j<n;j++){
L[j].st=a[i-1][j];
jv=j+(1<<(i-1));
L[j].dr=(jv<n?a[i-1][jv]:-1);
L[j].poz=j;
}
sort(L,L+n,cmp);
a[i][L[0].poz]=0,q=0;
for(j=1;j<n;j++)
a[i][L[j].poz]=(L[j].st==L[j-1].st && L[j-1].dr==L[j].dr?a[i][L[j-1].poz]:++q);
}
stp=i-1;
int maxim=0;
for(i=0;i<n-k;i++)
maxim=max(maxim,prefix(L[i].poz,L[i+k-1].poz));
g<<maxim;
f.close();
g.close();
return 0;
}