标签:cep 计算 字母 include 字符集 online 去掉 clu col
当字符集足够大的时候一定可以构造出来,这个时候考虑$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。
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 - 构造
标签:cep 计算 字母 include 字符集 online 去掉 clu col
原文地址:https://www.cnblogs.com/yyf0309/p/10232319.html