Cod sursa(job #875335)

Utilizator vlad_DVlad Dumitriu vlad_D Data 9 februarie 2013 22:16:52
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <algorithm>
#include <string.h>

using namespace std;

namespace suf {
const int MAXN = 65536;
const int MAXLG = 17;
char A[MAXN];
struct e { int nr[2], p; } L[MAXN];
int P[MAXLG][MAXN], N, stp, cnt, i;
bool cmp(const e &a, const e &b) {
  return a.nr[0] == b.nr[0] ? (a.nr[1] < b.nr[1]) : (a.nr[0] < b.nr[0]);
} 
void compute() {
  for (int i = 0; i < N; ++i) P[0][i] = A[i] - 'a'; // asta poate e diferita
   for (stp = 1, cnt = 1; cnt >> 1 < N; ++stp, cnt <<= 1) {
      for (i = 0; i < N; ++i) {
          L[i].nr[0] = P[stp - 1][i];
          L[i].nr[1] = i + cnt < N ? P[stp - 1][i + cnt] : -1;
          L[i].p = i;
      }
      sort(L, L + N, cmp);
      for (i = 0; i < N; ++i)
          P[stp][L[i].p] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[stp][L[i - 1].p] : i;
  } 
}
int lcp(int x, int y) { // prefixul comun a doua sub-fixe.
  int k, ret = 0;
  if (x == y) return N - x;
  for (k = stp - 1; k >= 0 && x < N && y < N; --k)
    if (P[k][x] == P[k][y])
      x += 1 << k, y += 1 << k, ret += 1 << k;
  return ret;
}
void clear() {
  memset(P, 0, sizeof(P)); memset(A, 0, sizeof(A)); memset(L, 0, sizeof(L));
  N = 0, stp = 0, cnt = 0;
}
void adapt(); // 
} // namespace suffix.

namespace in {
int N, K;
char A[65536];
}
using namespace in;
int main() {
  freopen("substr.in", "r", stdin);
  freopen("substr.out", "w", stdout);
  scanf("%d %d\n%s", &N, &K, &A);
  suf::adapt();
  return 0;
}

void suf::adapt() {
  N = in::N;
  strcpy(suf::A, in::A);
  compute();
  int mx = 0;
  for (int i = 0; i <= N - K; ++i) {
    int cm = lcp(L[i].p, L[i + K - 1].p);
    mx = max(cm, mx);
  }
  printf("%d\n", mx);
}