Cod sursa(job #1695853)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 27 aprilie 2016 21:10:19
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <algorithm>
#include <cstring>

#define pi pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

using namespace std;

ifstream in("substr.in");
ofstream out("substr.out");

const int N = 20000;
const int LOG = 16;

int n, k;
int sa[LOG][2 * N];
pair<pair<int, int>, int> crt[N];
string str;

void buildSuffArr() {
   int i, j;
   pair<int, int> pe;

   memset(sa, -1, sizeof(sa));

   for(i = 0; i < n; i++) {
      sa[0][i] = str[i];
   }
   for(i = 0; i < LOG - 1; i++) {
      for(j = 0; j < n; j++) {
         crt[j].first = make_pair(sa[i][j], sa[i][j + (1 << i)]);
         crt[j].second = j;
      }
      sort(crt, crt + n);
      for(j = 1; j < n; j++) {
         sa[i + 1][crt[j].second] = sa[i + 1][crt[j - 1].second];
         if(crt[j].first != crt[j - 1].first) sa[i + 1][crt[j].second]++;
      }
   }
}

int lcp(int i, int j) {
   int q = 0, p;

   for(p = LOG - 1; p >= 0; p--) {
      if(max(i, j) + (1 << p) <= n) {
         if(sa[p][i] == sa[p][j]) {
            q |= (1 << p);
            i += (1 << p);
            j += (1 << p);
         }
      }
   }

   return q;
}

int main() {
   int i;

   in >> n >> k >> str;

   buildSuffArr();

   int best = 0;
   for(i = 0; i < n - k; i++) {
      best = max(best, lcp(crt[i].second, crt[i + k - 1].second));
   }

   out << best << '\n';
   return 0;
}