【求助】37pts,后缀数组+快速排序,哪里出错了
查看原帖
【求助】37pts,后缀数组+快速排序,哪里出错了
121479
聪明的猪楼主2020/12/31 18:21

RT,萌新求教QAQ

#include <cstring>

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

const int kMaxN(1000000);

int n(0), k(0);
int kSa[kMaxN + 5];
int kRk[kMaxN + 5];
int kTmp[kMaxN + 5];

void CalcSa(const string&);
bool CompSa(int, int);

int main(void) {
  string str;
  memset(kSa, 0, sizeof(kSa));
  memset(kRk, 0, sizeof(kRk));
  memset(kTmp, 0, sizeof(kTmp));
  ios::sync_with_stdio(false);

  cin >> str;
  n = static_cast<int>(str.size());
  CalcSa(str);

  for (int i = 0; i < n - 1; ++i)
    cout << kSa[i] + 1 << ' ';

  cout << kSa[n - 1] + 1 << endl;

  return 0;
}

void CalcSa(const string& str) {
  for (int i = 0; i < n + 1; ++i) {
    kRk[i] = str[i];
    kSa[i] = i;
  }

  for (k = 1; k < n + 1; k <<= 1) {
    sort(kSa, kSa + n, CompSa);
    kTmp[kSa[0]] = 0;

    for (int i = 0; i < n; ++i)
      kTmp[kSa[i + 1]] = kTmp[kSa[i]] + (CompSa(kSa[i], kSa[i + 1]) ? 1 : 0);

    memcpy(kRk, kTmp, sizeof(kTmp));
  }
}

bool CompSa(int x, int y) {
  if (kRk[x] == kRk[y]) {
    int x_low(x + k < n + 1 ? kRk[x + k] : -1),
        y_low(y + k < n + 1 ? kRk[y + k] : -1);
    return x_low < y_low;
  } else {
    return kRk[x] < kRk[y];
  }
}
2020/12/31 18:21
加载中...