bzoj 4319 [Cerc 2008] Suffix reconstruction - 构造

Posted yyf0309

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 4319 [Cerc 2008] Suffix reconstruction - 构造相关的知识,希望对你有一定的参考价值。

题目传送门

  传送门

题目大意

  给定一个字符串的sa数组,要求输出任意一个由小写字母组成的合法字符串,不存在输出-1.

  当字符集足够大的时候一定可以构造出来,这个时候考虑$s_{sa_i} = i$。

  考虑按照$sa_i$的顺序来填字符。根据$sa$,我们可以计算出$rk$。

  显然$0 leqslant s_{sa_i} - s_{sa_{i - 1}}leqslant 1$(如果小于0,那么不合法,如果大于1,那么可以改小)。

  现在考虑$sa_i$和$sa_{i - 1}$指的两个后缀,可以用$rk$比较它们去掉首字母后的两个串的大小。然后就能判断这一位填的字符与前一位是相等还是恰好大1。

Code

 1 /**
 2  * bzoj
 3  * Problem#4319
 4  * Accepted
 5  * Time: 684ms
 6  * Memory: 5684k
 7  */
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 typedef bool boolean;
11 
12 const int N = 5e5 + 5;
13 
14 int n;
15 char str[N];
16 int sa[N], rk[N];
17 
18 int main() {
19     scanf("%d", &n);
20     rk[n + 1] = 0;
21     for (int i = 1; i <= n; i++) {
22         scanf("%d", sa + i);
23         rk[sa[i]] = i;
24     } 
25     int cnt = 0;
26     str[sa[1]] = a;
27     for (int i = 2; i <= n; i++) {
28         if (rk[sa[i] + 1] < rk[sa[i - 1] + 1])
29             cnt++;
30         str[sa[i]] = a + cnt;
31     }
32     if (cnt >= 26) {
33         puts("-1");
34     } else {
35         puts(str + 1);
36     }
37     return 0;
38 }

以上是关于bzoj 4319 [Cerc 2008] Suffix reconstruction - 构造的主要内容,如果未能解决你的问题,请参考以下文章

CERC2008BZOJ4319Suffix reconstruction

[CERC 2008] Suffix reconstruction

BZOJ1166 : [Baltic2008]Magical Stones

bzoj 1552: [Cerc2007]robotic sort

bzoj 1552: [Cerc2007]robotic sort.

BZOJ4052[Cerc2013]Magical GCD 乱搞