bzoj 4319 [Cerc 2008] Suffix reconstruction - 构造
Posted yyf0309
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 4319 [Cerc 2008] Suffix reconstruction - 构造相关的知识,希望对你有一定的参考价值。
当字符集足够大的时候一定可以构造出来,这个时候考虑$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