Pagini recente » Cod sursa (job #1285173) | Cod sursa (job #1804658) | Cod sursa (job #412542) | Cod sursa (job #2938909) | Cod sursa (job #2343504)
#include <fstream>
#include <algoritm>
#define DIM 16400
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;
ifstream fin ("substr.in");
ofstream fout("substr.out");
int n,k,i,e,len,sol,p[17][DIM],v[DIM];
char s[DIM];
pair< pair<int, int>, int > L[DIM];
int lcp(int i, int j){
int f=e;
int putere=(1<<e);
int sol=0;
while (putere){
if (p[f][i]==p[f][j]){
sol+=putere;
i+=putere;
j+=putere;
}
f--;
putere/=2;
}
return sol;
}
int main(){
fin>>n>>k;
if (k==1){
fout<<n;
return 0;
}
fin>>s;
for (i=0;i<n;i++)
p[0][i]=s[i]-'0';
for (e=0, len=1;len<=n;e++, len*=2){
for (i=0;i<n;i++){
L[i].v1=p[e][i];
if (i+len<n)
L[i].v2=p[e][i+len];
else
L[i].v2=-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].v1==L[i-1].v1 && L[i].v2==L[i-1].v2)
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;
}