ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#123 | #3. 【模板】后缀排序 | __vector__ | 70 | 734ms | 50312kb | C++23 | 2.1kb | 2025-04-17 12:43:31 | 2025-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