提交记录 8677


用户 题目 状态 得分 用时 内存 语言 代码长度
bzy 1006. 【模板题】后缀排序 Wrong Answer 0 49.944 ms 4156 KB C++11 1.97 KB
提交时间 评测时间
2019-03-03 11:12:39 2020-08-01 01:23:02
#include<bits/stdc++.h>
using namespace std;

namespace SFX{
    int SA[200005];
    int RK[200005];
    int H [200005];
    string S; int n;
    
    void Debug(){
        for(int i = 1;i <= n;i ++) cout << RK[i] << " "; cout << "\n";
    }
    
    void init(){
        n = S.size();
        for( int i = 1; i <= n; i ++ ) RK[i] = S[i - 1] - 'a' + 1;
        //Debug();
        for( int i = 1; i <= n; i <<= 1 ) {
            static int f[100005], s[100005], t[100005];
            memset( f, 0, sizeof(f) );
            for( int j = 1; j <= n; j ++ ) f[ RK[j + i] ] ++;
            for( int j = 1; j <= n; j ++ ) f[j] += f[j - 1];
            for( int j = 1; j <= n; j ++ ) s[ f[ RK[j + i] ] -- ] = j;
            //for( int j = 1; j <= n; j ++ ) cout << s[j] << " "; cout << "]\n";
            memset( f, 0, sizeof(f) );
            for( int j = 1; j <= n; j ++ ) f[ RK[j] ] ++;
            for( int j = 1; j <= n; j ++ ) f[j] += f[j - 1];
            for( int j = n; j >= 1; j -- ) t[ f[ RK[ s[j] ] ] -- ] = s[j];
            //for( int j = 1; j <= n; j ++ ) cout << t[j] << " "; cout << "]\n";
            int ll = -1, lr = -1, rank = 0;
            static int r[100005];
            for( int j = 1; j <= n; j ++ ) {
                if( ll != RK[ t[j] ] or lr != RK[ t[j] + i ] ) rank ++;
                r[ t[j] ] = rank;
                ll = RK[ t[j] ]; lr = RK[ t[j] + i ];
            }
            for( int j = 1; j <= n; j ++ ) RK[j] = r[j];
            //Debug();
        }
        for( int i = 1; i <= n; i ++ ) SA[ RK[i] ] = i;
        int pt = 0; S += '#';
        for( int i = 1; i <= n; i ++ ){
            if( pt ) pt --;
            int x = SA[ RK[i] - 1 ];
            while( S[ i + pt - 1 ] == S[ x + pt - 1 ] ) pt ++;
            H[ RK[i] ] = pt;
        }
    }
}

void output(){
using namespace SFX;
    for(int i = 1;i <= n;i ++) cout << SA[i] << " "; cout << "\n";
    for(int i = 2;i <= n;i ++) cout << H [i] << " ";
}

int main(){
    cin >> SFX::S;
    SFX::init(); output();
    return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #176.75 us452 KBWrong AnswerScore: 0

Subtask #1 Testcase #2101.35 us452 KBAcceptedScore: 100

Subtask #1 Testcase #394.78 us452 KBWrong AnswerScore: -100

Subtask #1 Testcase #4155.25 us452 KBAcceptedScore: 0

Subtask #1 Testcase #5129.89 us452 KBAcceptedScore: 0

Subtask #1 Testcase #6147.65 us452 KBAcceptedScore: 0

Subtask #1 Testcase #749.944 ms3 MB + 704 KBAcceptedScore: 0

Subtask #1 Testcase #848.805 ms3 MB + 892 KBAcceptedScore: 0

Subtask #1 Testcase #949.291 ms3 MB + 756 KBAcceptedScore: 0

Subtask #1 Testcase #1030.666 ms2 MB + 652 KBAcceptedScore: 0

Subtask #1 Testcase #1130.419 ms2 MB + 692 KBAcceptedScore: 0

Subtask #1 Testcase #1238.534 ms4 MB + 60 KBAcceptedScore: 0

Subtask #1 Testcase #1338.264 ms4 MB + 28 KBAcceptedScore: 0

Subtask #1 Testcase #1448.378 ms3 MB + 784 KBAcceptedScore: 0

Subtask #1 Testcase #1547.792 ms3 MB + 800 KBAcceptedScore: 0

Subtask #1 Testcase #1635.593 ms4 MB + 60 KBAcceptedScore: 0

Subtask #1 Testcase #1734.79 ms4 MB + 60 KBAcceptedScore: 0

Subtask #1 Testcase #1834.927 ms4 MB + 60 KBAcceptedScore: 0


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