Cod sursa(job #1985460)

Utilizator cella.florescuCella Florescu cella.florescu Data 27 mai 2017 22:23:42
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1 << 14;
const int MAXLOG = 15;

int mat[MAXLOG][2 * MAXN];
int n;
pair <pair <int, int>, int> suff[MAXN];

int lcp(int i, int j) {
  int ans = 0;
  for (int p2 = MAXLOG - 1; p2 >= 0; --p2)
    if (i + (1 << p2) - 1 < n && j + (1 << p2) - 1 < n && mat[p2][i] == mat[p2][j]) {
      i += (1 << p2);
      j += (1 << p2);
      ans += (1 << p2);
    }
  return ans;
}

int main()
{
    int k, ans;
    FILE *fin = fopen("substr.in", "r");
    fscanf(fin, "%d%d ", &n, &k);
    memset(mat, -1, sizeof mat);
    for (int i = 0; i < n; ++i) {
      fscanf(fin, "%c", &mat[0][i]);
      suff[i] = {{mat[0][i], 0}, i};
    }
    sort(suff, suff + n);
    for (int p2 = 1; (1 << p2) < n; ++p2) {
      for (int i = 0; i < n; ++i)
        suff[i] = {{mat[p2 - 1][i], mat[p2 - 1][i + (1 << (p2 - 1))]}, i};
      sort(suff, suff + n);
      mat[p2][suff[0].second] = 0;
      for (int i = 1; i < n; ++i)
        mat[p2][suff[i].second] = mat[p2][suff[i - 1].second] + (suff[i - 1].first != suff[i].first);
    }
    ans = 0;
    for (int i = 0; i + k - 1 < n; ++i)
      ans = max(ans, lcp(suff[i].second, suff[i + k - 1].second));
    ofstream fout("substr.out");
    fout << ans << '\n';
    fout.close();
    return 0;
}