Pagini recente » Cod sursa (job #1594653) | Cod sursa (job #275303) | Cod sursa (job #2244252) | Cod sursa (job #479399) | Cod sursa (job #2343248)
#include <fstream>
#include <algorithm>
#define x first.first
#define y first.second
#define poz second
#define dim 16400
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n,k,i,e,len,sol;
char s;
pair <pair<int,int>,int> l[dim];
int p[17][dim],v[dim];
int lcp(int i, int j){
int f=e;
int P=(1<<e);
int sol=0;
while(P){
if(p[f][i]==p[f][j]){
sol+=P;
i+=P;
j+=P;
}
f--;
P/=2;
}
return sol;
}
int main(){
fin>>n>>k;
for(i=0;i<n;i++){
fin>>s;
p[0][i]=s-'0';
}
if(k==1){
fout<<n;
return 0;
}
for(e=0,len=1;len<=n;e++,len*=2){
for(i=0;i<n;i++){
l[i].x=p[e][i];
if(i+len<n)
l[i].y=p[e][i+len];
else
l[i].y=-1;
l[i].poz=i;
}
sort(l,l+n);
p[e+1][l[0].poz]=0;
for(i=1;i<n;i++)
if(l[i].first == l[i-1].first)
p[e+1][l[i].poz]=p[e+1][l[i-1].poz];
else
p[e+1][l[i].poz]=p[e+1][l[i-1].poz]+1;
}
for(i=0;i<n;i++)
v[p[e][i]]=i;
for(i=0;i+k-1<n;i++)
sol=max(sol,lcp(v[i],v[i+k-1]));
fout<<sol;
return 0;
}