Pagini recente » Cod sursa (job #1956730) | Cod sursa (job #1553474) | Cod sursa (job #2555987) | Cod sursa (job #1110592) | Cod sursa (job #1509573)
#include <bits/stdc++.h>
using namespace std;
int Sort[100000];
char str[100000];
int Class[16][50000];
pair<int, int> Aux[50000];
int n;
void build_array() {
for(int i=1; i<=n; i++)
Sort[i] = i;
sort(Sort+1, Sort+n+1, [](int a, int b) {return str[a] < str[b];});
for(int i=1; i<=n; i++)
Class[0][Sort[i]] = Class[0][Sort[i-1]] + (str[Sort[i]] != str[Sort[i-1]]);
for(int i=1; (1 << i) <= n; i++) {
for(int j=1; j<=n; j++)
Aux[j] = {Class[i-1][j], Class[i-1][j + (1 << (i-1))]};
sort(Sort+1, Sort+n+1, [](int a, int b) { return Aux[a] < Aux[b]; });
for(int j=1; j<=n; j++)
Class[i][Sort[j]] = Class[i][Sort[j-1]] + (Aux[Sort[j]] != Aux[Sort[j-1]]);
}
}
int lcp(int i, int j) {
int step, sol = 0;
i = Sort[i]; j = Sort[j];
for(step=0; (1<<step) <= n; step++);
for(step--; step>=0; step--) {
if(Class[step][i] == Class[step][j]) {
sol += (1 << step);
i += (1 << step);
j += (1 << step);
}
}
//cerr<<sol;
return sol;
}
int main() {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int k;
cin>>n>>k>>str+1;
build_array();
//for(int i=1; i<=n; i++) cerr<<Sort[i]<<" "; cerr<<endl;
int best = 0;
for(int i=k; i<=n; i++)
best = max(best, lcp(i-k+1, i));
cout<<best;
return 0;
}