码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 4319 [Cerc 2008] Suffix reconstruction - 构造

时间:2019-01-07 17:25:32      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:cep   计算   字母   include   字符集   online   去掉   clu   col   

题目传送门

  传送门

题目大意

  给定一个字符串的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 - 构造

标签:cep   计算   字母   include   字符集   online   去掉   clu   col   

原文地址:https://www.cnblogs.com/yyf0309/p/10232319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!