Logo Wy Online Judge

WyOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#123#3. 【模板】后缀排序__vector__70734ms50312kbC++232.1kb2025-04-17 12:43:312025-04-17 12:44:17

answer


#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
char s[maxn];
int n;
int rk[maxn<<1],sa[maxn<<1];
int oldrk[maxn<<1];
struct List
{
    int head[maxn];
    int endpos[maxn];
    int nxt[maxn];
    int val[maxn];
    int cnt=0;
    int max_of_lists=0;
    void add(int x,int _val)
    {
        cnt++;
        if(!head[x])
        {
            head[x]=cnt;
            max_of_lists=max(max_of_lists,x);
        }
        nxt[endpos[x]]=cnt;
        endpos[x]=cnt;
        val[cnt]=_val;
        nxt[cnt]=0;
    }
    void clear()
    {
        for(int i=0;i<=max_of_lists;i++)head[i]=endpos[i]=0;
        for(int i=0;i<=cnt;i++)nxt[i]=val[i]=0;
        cnt=max_of_lists=0;
    }
}bar1,bar2;
int main()
{
    scanf("%s",s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        sa[i]=i,rk[i]=s[i];
    }
    for(int w=1;w<n;w<<=1)
    {
        int maxrk=0;
        for(int i=1;i<=n;i++)
        {
            maxrk=max(maxrk,rk[i]);
        }
       // if(maxrk==n)break;

       for(int i=1;i<=n;i++)
       {
         //  bar1[rk[i+w]].emplace_back(i);
            bar1.add(rk[i+w],i);
       }

        for(int i=0;i<=maxrk;i++)
        {
        //    printf("i = %d\n",i);
            for(int j=bar1.head[i];j;j=bar1.nxt[j])
            {
                int v=bar1.val[j];
              // bar2[rk[v]].emplace_back(v);
                bar2.add(rk[v],v);
            //    printf("v = %d\n",v);
            }
        }
        int cnt=0;
        for(int i=0;i<=maxrk;i++)
        {
            for(int j=bar2.head[i];j;j=bar2.nxt[j])
            {
                int v=bar2.val[j];
                sa[++cnt]=v;
            }
        }

        for(int i=0;i<=n;i++)oldrk[i]=rk[i];

        for(int i=1,p=0;i<=n;i++)
        {
            if(oldrk[sa[i]]==oldrk[sa[i-1]]&&oldrk[sa[i]+w]==oldrk[sa[i-1]+w])
            {
                rk[sa[i]]=p;
            }
            else rk[sa[i]]=++p;

        }
        bar1.clear();
        bar2.clear();
    }
    for(int i=1;i<=n;i++)printf("%d ",sa[i]);
    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 7
Accepted
time: 4ms
memory: 22156kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T

output:

67 61 68 62 99 87 44 70 69 32 36 3 5 77 94 11 96 89 8 56 17 54 88 63 41 13 1 33 83 74 37 45 21 57 80...

result:

ok 100 numbers

Test #2:

score: 7
Accepted
time: 1ms
memory: 19816kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:

67 834 61 984 435 230 932 390 302 791 991 68 961 835 551 887 814 423 143 749 541 62 166 729 910 465 ...

result:

ok 1000 numbers

Test #3:

score: 7
Accepted
time: 2ms
memory: 21920kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:

67 834 61 984 435 230 932 390 302 791 991 68 961 835 551 887 814 423 143 749 541 62 166 729 910 465 ...

result:

ok 1000 numbers

Test #4:

score: 7
Accepted
time: 8ms
memory: 20068kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:

1215 67 7665 834 1826 7511 5919 3053 61 3312 6300 2679 1594 4074 9549 3994 1216 9041 7309 984 435 97...

result:

ok 10000 numbers

Test #5:

score: 7
Accepted
time: 9ms
memory: 22020kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:

1215 67 7665 834 1826 7511 5919 3053 61 3312 6300 2679 1594 4074 9549 3994 1216 9041 7309 984 435 97...

result:

ok 10000 numbers

Test #6:

score: 7
Accepted
time: 101ms
memory: 27116kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:

68971 23766 16236 84001 1215 26527 48751 32248 30140 72030 28767 92557 43162 24259 25407 54376 75855...

result:

ok 100000 numbers

Test #7:

score: 7
Accepted
time: 98ms
memory: 29300kb

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:

68971 23766 16236 84001 1215 26527 48751 32248 30140 72030 28767 92557 43162 24259 25407 54376 75855...

result:

ok 100000 numbers

Test #8:

score: 0
Time Limit Exceeded

input:

5Q2K2Pz3vL3K5NFJ48Lj77MYpTRo8dq25fS26BUl59i16a9kuxuFu4d477vz0057gB00218hv69C2Wz7Fk5pMt153uVAq3F3rK0T...

output:


result:


Test #9:

score: 0
Time Limit Exceeded

input:

eX8N69cLH4G7P8QDy5156Hx8m0VN4sH9t0C4MoGd0cN51dgGXJL73z6N20CLISd0X1nhFKvdXa5q2nWCMjmkM30Es5tAZ5L6c306...

output:


result:


Test #10:

score: 0
Time Limit Exceeded

input:

8585jh1f9l3466C87O58gfT7sPR0Vw2kdl75l450z1aiD294Q98lb2h4eWb77E8O987OzoJ1617c76ewlDF6G35z0p51g7X53r96...

output:


result:


Test #11:

score: 7
Accepted
time: 4ms
memory: 21984kb

input:

00000

output:

5 4 3 2 1 

result:

ok 5 number(s): "5 4 3 2 1"

Test #12:

score: 7
Accepted
time: 3ms
memory: 19816kb

input:

aaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

500 499 498 497 496 495 494 493 492 491 490 489 488 487 486 485 484 483 482 481 480 479 478 477 476 ...

result:

ok 500 numbers

Test #13:

score: 7
Accepted
time: 504ms
memory: 50312kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

1000000 999999 999998 999997 999996 999995 999994 999993 999992 999991 999990 999989 999988 999987 9...

result:

ok 1000000 numbers