萌新求助
查看原帖
萌新求助
450878
TianShui楼主2022/3/25 22:43
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 100005

int n, k;
char s[N];
int r[N << 1], sa[N << 1], temp[N << 1];

bool cmp(int i, int j) {
    if (r[i] != r[j])   return r[i] < r[j];
    int ri = i + k < 2 * n ? r[i + k] : -1;
    int rj = j + k < 2 * n ? r[j + k] : -1;
    return ri < rj;
}

void SA() {
    for (int i = n; i < 2 * n; i++) {
        s[i] = s[i - n];
    }
    s[2 * n] = '\0';
    for (int i = 0; i < 2 * n; i++) {
        sa[i] = i;
        r[i] = s[i];
    }
    for (k = 1; k <= n; k *= 2) {
        sort(sa, sa + 2 * n, cmp);
        temp[sa[0]] = 0;
        for (int i = 1; i < 2 * n; i++) {
            temp[sa[i]] = temp[sa[i - 1]] + (cmp(sa[i - 1], sa[i]) ? 1 : 0);
        }
        for (int i = 0; i < 2 * n; i++) {
            r[i] = temp[i];
        }
    }
}

int main() {
    scanf("%s", s);
    n = strlen(s);
    SA();
    int cnt = 0;
    for (int i = 0; i < 2 * n; i++) {
        if (sa[i] < n) {
            printf("%c", s[sa[i] + n - 1]);
        }
    }
}

把N多加一个0之后就AC了,不加只有60分,不知道为什么?求助

2022/3/25 22:43
加载中...