Cod sursa(job #2467591)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 4 octombrie 2019 17:38:19
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 100005;
const int MAX_LG = 17;

int n, k;

char s[MAX_N];
int suff[MAX_LG][MAX_N];

int sorted[MAX_N];

pair < pair < int, int > , int > arr[MAX_N];

void suffixArrays() {
  for (int i = 1; i <= n; ++i) {
    suff[0][i] = s[i];
  }
  for (int step = 1; step <= 14; ++step) {
    for (int i = 1; i <= n; ++i) {
      if (i + (1 << (step - 1)) > n) {
        arr[i] = {{suff[step - 1][i], 0}, i};
      } else {
        arr[i] = {{suff[step - 1][i], suff[step - 1][i + (1 << (step - 1))]}, i};
      }
    }
    sort(arr + 1, arr + n + 1);
    int p = 1;
    suff[step][arr[p].second] = p;
    for (int i = 2; i <= n; ++i) {
      if (arr[i].first != arr[p].first) {
        arr[++p] = arr[i];
      }
      suff[step][arr[i].second] = p;
    }
    for (int i = 1; i <= n; ++i) {
      sorted[suff[step][i]] = i;
    }
  }
}

int lcp(int x, int y) {
  int ans = 0;
  for (int step = MAX_LG - 3; step >= 0; --step) {
    if (suff[step][x] == suff[step][y]) {
      ans += (1 << step);
      x += (1 << step);
      y += (1 << step);
    }
  }
  return ans;
}

int main() {
  freopen("substr.in", "r", stdin);
  freopen("substr.out", "w", stdout);
  scanf("%d %d\n", &n, &k);
  for (int i = 1; i <= n; ++i) {
    scanf("%c", &s[i]);
  }
  if (k == 1) {
    printf("%d", n);
    return 0;
  }
  suffixArrays();
  int ans = 0;
  for (int i = 1; i <= n - k + 1; ++i) {
    ans = max(ans, lcp(sorted[i], sorted[i + k - 1]));
  }
  printf("%d", ans);
  return 0;
}