提交记录 31451


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_dsh_260814 1006. 【模板题】后缀排序 Wrong Answer 0 4.756 ms 2588 KB C++ 4.85 KB
提交时间 评测时间
2026-08-14 01:57:43 2026-08-14 01:57:48
#include <cstdio>
#include <cstring>

static const int MAXN = 100010;

static unsigned char S[MAXN];
static int SA[MAXN];
static int RANK[MAXN];
static int H[MAXN];

template <class T>
static void induce(T *s, unsigned char *t, int *sa, int n, int K,
                   int *SL, int *SS, int *BUF, const int *lms, int m) {
    memset(sa, -1, n * 4);
    memcpy(BUF, SS, (K + 1) * 4);
    for (int i = 0; i < m; i++) {
        int d = lms[i];
        sa[BUF[s[d]]++] = d;
    }
    memcpy(BUF, SL, (K + 1) * 4);
    sa[BUF[s[n - 1]]++] = n - 1;
    for (int i = 0; i < n; i++) {
        int v = sa[i];
        if (v >= 1 && !t[v - 1]) sa[BUF[s[v - 1]]++] = v - 1;
    }
    memcpy(BUF, SL, (K + 1) * 4);
    for (int i = n - 1; i >= 0; i--) {
        int v = sa[i];
        if (v >= 1 && t[v - 1]) sa[--BUF[s[v - 1] + 1]] = v - 1;
    }
}

template <class T>
static void sais(T *s, int *sa, int n, int K) {
    if (n == 1) { sa[0] = 0; return; }
    if (n == 2) {
        if (s[0] < s[1]) { sa[0] = 0; sa[1] = 1; }
        else { sa[0] = 1; sa[1] = 0; }
        return;
    }
    unsigned char *t = new unsigned char[n];
    t[n - 1] = 0;
    for (int i = n - 2; i >= 0; i--) {
        t[i] = (s[i] == s[i + 1]) ? t[i + 1] : (s[i] < s[i + 1]);
    }

    int *SL = new int[K + 1];
    int *SS = new int[K + 1];
    int *BUF = new int[K + 1];
    memset(SL, 0, (K + 1) * 4);
    memset(SS, 0, (K + 1) * 4);
    for (int i = 0; i < n; i++) {
        if (!t[i]) SS[s[i]]++;
        else SL[s[i] + 1]++;
    }
    for (int i = 0; i < K; i++) {
        SS[i] += SL[i];
        SL[i + 1] += SS[i];
    }

    int *LMSMAP = new int[n + 1];
    memset(LMSMAP, -1, (n + 1) * 4);
    int *LMS = new int[n];
    int m = 0;
    for (int i = 1; i < n; i++) {
        if (!t[i - 1] && t[i]) { LMSMAP[i] = m; LMS[m] = i; m++; }
    }

    induce(s, t, sa, n, K, SL, SS, BUF, LMS, m);

    if (m) {
        int *SLMS = new int[m];
        {
            int p = 0;
            for (int i = 0; i < n; i++) {
                int v = sa[i];
                if (v >= 0 && LMSMAP[v] != -1) SLMS[p++] = v;
            }
        }
        int *RS = new int[m];
        int rec_upper = 0;
        RS[LMSMAP[SLMS[0]]] = 0;
        for (int i = 1; i < m; i++) {
            int l = SLMS[i - 1], r = SLMS[i];
            int end_l = (LMSMAP[l] + 1 < m) ? LMS[LMSMAP[l] + 1] : n;
            int end_r = (LMSMAP[r] + 1 < m) ? LMS[LMSMAP[r] + 1] : n;
            bool same = true;
            if (end_l - l != end_r - r) {
                same = false;
            } else {
                while (l < end_l) {
                    if (s[l] != s[r]) break;
                    l++; r++;
                }
                if (l == n || s[l] != s[r]) same = false;
            }
            if (!same) rec_upper++;
            RS[LMSMAP[SLMS[i]]] = rec_upper;
        }
        int *RSA = new int[m];
        sais(RS, RSA, m, rec_upper + 1);
        for (int i = 0; i < m; i++) SLMS[i] = LMS[RSA[i]];
        induce(s, t, sa, n, K, SL, SS, BUF, SLMS, m);
        delete[] SLMS;
        delete[] RS;
        delete[] RSA;
    }

    delete[] t;
    delete[] SL;
    delete[] SS;
    delete[] BUF;
    delete[] LMSMAP;
    delete[] LMS;
}

static const char D2[] =
"00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899";

static char inbuf[1 << 20];
static char outbuf[1 << 22];

static inline char* wint(char *p, int v, char sep) {
    if (v >= 100000) {
        *p++ = '1'; *p++ = '0'; *p++ = '0'; *p++ = '0'; *p++ = '0'; *p++ = '0';
        *p++ = sep; return p;
    }
    if (v >= 10000) {
        int q = v / 10000;
        *p++ = '0' + q;
        v -= q * 10000;
        int a = v / 100, b = v % 100;
        p[0] = D2[a * 2]; p[1] = D2[a * 2 + 1];
        p[2] = D2[b * 2]; p[3] = D2[b * 2 + 1];
        p += 4;
        *p++ = sep; return p;
    }
    if (v >= 1000) {
        int q = v / 1000;
        *p++ = '0' + q;
        v -= q * 1000;
        int a = v / 100, b = v % 100;
        *p++ = '0' + a;
        p[0] = D2[b * 2]; p[1] = D2[b * 2 + 1];
        p += 2;
        *p++ = sep; return p;
    }
    if (v >= 100) {
        int q = v / 100;
        *p++ = '0' + q;
        v -= q * 100;
        p[0] = D2[v * 2]; p[1] = D2[v * 2 + 1];
        p += 2;
        *p++ = sep; return p;
    }
    if (v >= 10) {
        p[0] = D2[v * 2]; p[1] = D2[v * 2 + 1];
        p += 2;
        *p++ = sep; return p;
    }
    *p++ = '0' + v;
    *p++ = sep; return p;
}

int main() {
    size_t nread = fread(inbuf, 1, sizeof(inbuf), stdin);
    int n = 0;
    while (n < (int)nread && inbuf[n] >= 'a' && inbuf[n] <= 'z') n++;
    for (int i = 0; i < n; i++) S[i] = (unsigned char)(inbuf[i] - 'a');

    sais<unsigned char>(S, SA, n, 26);


    char *p = outbuf;
    *p++ = '1';
    *p++ = '\n';
    fwrite(outbuf, 1, p - outbuf, stdout);
    return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #111.97 us40 KBWrong AnswerScore: 0

Subtask #1 Testcase #210.58 us40 KBWrong AnswerScore: 0

Subtask #1 Testcase #310.5 us40 KBWrong AnswerScore: 0

Subtask #1 Testcase #415.91 us44 KBWrong AnswerScore: 0

Subtask #1 Testcase #513.2 us40 KBWrong AnswerScore: 0

Subtask #1 Testcase #615.13 us44 KBWrong AnswerScore: 0

Subtask #1 Testcase #74.756 ms2 MB + 540 KBWrong AnswerScore: 0

Subtask #1 Testcase #84.676 ms1 MB + 928 KBWrong AnswerScore: 0

Subtask #1 Testcase #94.729 ms2 MB + 72 KBWrong AnswerScore: 0

Subtask #1 Testcase #103.058 ms1 MB + 396 KBWrong AnswerScore: 0

Subtask #1 Testcase #113.37 ms1 MB + 308 KBWrong AnswerScore: 0

Subtask #1 Testcase #121.149 ms1 MB + 84 KBWrong AnswerScore: 0

Subtask #1 Testcase #131.982 ms1 MB + 84 KBWrong AnswerScore: 0

Subtask #1 Testcase #142.167 ms1 MB + 436 KBWrong AnswerScore: 0

Subtask #1 Testcase #152.138 ms1 MB + 416 KBWrong AnswerScore: 0

Subtask #1 Testcase #162.018 ms2 MB + 96 KBWrong AnswerScore: 0

Subtask #1 Testcase #172.207 ms2 MB + 300 KBWrong AnswerScore: 0

Subtask #1 Testcase #182.128 ms2 MB + 240 KBWrong AnswerScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-12 08:26:32 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠