Pagini recente » Cod sursa (job #2785526) | Cod sursa (job #1958779) | Cod sursa (job #2548117) | Cod sursa (job #883404) | Cod sursa (job #3124390)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 16340;
const int LMAX = 16;
string str;
int n,k,p[NMAX][LMAX],lg,ord[NMAX];
struct element{
pair<int, int> pos;
int idx;
} v[NMAX];
ifstream fin("substr.in");
ofstream fout("substr.out");
int lcp(int x, int y){
int k = 0, ans = 0;
if(x == y){
return n-x;
}
for(k = lg-1; k >= 0 && x < n && y < n; k--){
if(p[x][k] == p[y][k]){
x += (1<<k);
y += (1<<k);
ans += (1<<k);
}
}
return ans;
}
int getval(char ch){
return (ch-'0');
}
int main()
{
fin >> n >> k;
fin >> str;
for(int i = 0; i < n; i++){
p[i][0] = getval(str[i]);
}
for(int i = 1, pwr = 1; (pwr/2) < n; i++, pwr <<= 1, lg++){
for(int j = 0; j < n; j++){
v[j].pos.first = p[j][i-1];
if(j+pwr < n){
v[j].pos.second = p[j+pwr][i-1];
}else{
v[j].pos.second = -1;
}
v[j].idx = j;
}
sort(v, v+n, [&](element &a, element &b){
if(a.pos.first < b.pos.first){
return true;
}else if(a.pos.first == b.pos.first){
if(a.pos.second < b.pos.second){
return true;
}
}
return false;
});
int lst = -1;
int cnt = 0;
for(int j = 0; j < n; j++){
if(lst == -1){
p[v[j].idx][i] = cnt++;
lst = j;
}else{
if(v[lst].pos == v[j].pos){
p[v[j].idx][i] = cnt++;
}else{
p[v[j].idx][i] = cnt;
lst = j;
}
}
}
}
int ans = 0;
for(int i = 0; i < n; i++){
ord[p[i][lg]] = i;
}
for(int i = 0; i < n-k; i++){
ans = max(ans, lcp(ord[i], ord[i+k-1]));
}
fout << ans;
return 0;
}