Pagini recente » Cod sursa (job #2860825) | Cod sursa (job #257299) | Cod sursa (job #48921) | Cod sursa (job #1701362) | Cod sursa (job #2343468)
#include <fstream>
#include <algorithm>
#define DIM 17000
#define ff first.first
#define fs first.second
#define poz second
using namespace std;
ifstream fin ("substr.in");
ofstream fout("substr.out");
int n,k,i,exp,sol,lng,mat[16][DIM],v[DIM];
pair< pair<int, int>, int > L[DIM];
char e[DIM];
int lcp(int i, int j) {
int k, sol=0, x;
if (i == j)
return n - i;
for (k=exp; k>=0 && i<n && j<n; --k)
if (mat[k][i] == mat[k][j]){
x=(1<<k);
i+= x;
j+= x;
sol+= x;
}
return sol;
}
int main() {
fin>>n>>k;
if (k==1) {
fout<<n;
return 0;
}
fin>>e;
for (i=0;i<n;i++)
mat[0][i]=(e[i]-'0');
for (exp=0,lng=1; lng<=n; exp++,lng*=2) {
for (i=0;i<n;i++) {
L[i].ff=mat[exp][i];
if (i+lng<n)
L[i].fs=mat[exp][i+lng];
else
L[i].fs='$';
L[i].poz = i;
}
sort(L, L+n);
mat[exp+1][L[0].poz]=0;
for (i=1;i<n;i++)
if (L[i].ff == L[i-1].ff && L[i].fs == L[i-1].fs)
mat[exp+1][L[i].poz]=mat[exp+1][L[i-1].poz];
else
mat[exp+1][L[i].poz]=mat[exp+1][L[i-1].poz]+1;
}
for (i=0;i<n;i++) {
v[mat[exp][i]]=i;
}
for (i=0; i+k-1<n; i++) {
sol = max(sol, lcp(v[i], v[i+k-1]));
}
fout<<sol;
return 0;
}