HDU - 2970 Suffix reconstruction
For example, if s = abbaabab, the sorted list of all suffixes becomes: aabab, ab, abab, abbaabab, b, baabab, bab, bbaabab and the suffix array is 4, 7, 5, 1, 8, 3,6, 2.
It turns out that it is possible to construct this array in a linear time. Your task will be completely different, though: given p(1), p(2), p(3),... , p(n) you should check if there exist at least one text consisting of lowercase letters of the English alphabet for which this sequence is the suffix array. If so, output any such text. Otherwise output -1.
Input
The input contains several descriptions of suffix arrays. The first line contains the number of descriptions t (t <= 100). Each description begins with a line containing the length of both the text and the array n (1 <= n <= 500000). Next line contains integers p(1), p(2), ... ,p(n). You may assume that 1 <= p(i) <= n and no value of p(i) occurs twice. Total size of the input will not exceed 50MB.
Output
For each test case
If there are multiple answers, output the smallest dictionary order in the given suffix array. In case there is no such text consisting of lowercase letters of the English alphabet, output -1.
Sample Input
6
2
1 2
2
2 1
3
2 3 1
6
3 4 5 1 2 6
14
3 10 2 12 14 5 13 4 1 8 6 11 7 9
7
5 1 7 4 3 2 6
Sample Output
ab
aa
bab
bcaaad
ebadcfgehagbdc
bcccadc 首先如果字符集无限大的话,答案是很好构造的。但是字符集有限制的话,我们就必须尽量压缩字符。
比如,ac可以被替换成ab;最小的字符应该是a;还有最重要的一点:(假设rank[i]是从第i位开始的后缀的排名,越小越靠前)如果我们顺着sa数组指向的后缀扫的话,后缀首字母肯定是连续一段的a,然后连续一段的b....我们判断s[sa[i]]是否可以等于s[sa[i-1]]的时候,只需要判断rank[sa[i]+1]是否大于rank[sa[i-1]+1]就可以了。
学过后缀数组sa的都知道,我们通过sa是可以复原rank的,理论上说rank就是sa的一个逆置换(sa[i]是排名第i的后缀的下标开始位置,rank[i]是开始位置是i的排名),所以rank[sa[i]]=i。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=500005;
int T,n,sa[maxn],R[maxn];
char s[maxn];
bool flag;
inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
}
int main(){
T=read();
while(T--){
n=read(),flag=1;
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++) sa[i]=read();
for(int i=1;i<=n;i++) R[sa[i]]=i;
s[sa[1]]='a',R[n+1]=0;
for(int i=2;i<=n;i++){
if(R[sa[i-1]+1]<R[sa[i]+1]) s[sa[i]]=s[sa[i-1]];
else s[sa[i]]=s[sa[i-1]]+1; if(s[sa[i]]>'z'){
flag=0;
break;
}
} if(flag) printf("%s\n",s+1);
else puts("-1");
}
}
HDU - 2970 Suffix reconstruction的更多相关文章
- bzoj 4319: Suffix reconstruction 后缀数组+构造
题目大意 给定后缀数组sa,要求构造出满足sa数组的字符串.或输出无解\(n\leq 5*10^5\) 题解 我们按照字典序来考虑每个后缀 对于\(Suffix(sa[i])\)和\(Suffix(s ...
- BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
原文链接http://www.cnblogs.com/zhouzhendong/p/9016336.html 题目传送门 - BZOJ4319 题意 给出一个$1,2,\cdots,n$的排列,第$i ...
- BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)
题目链接 \(Description\) 给定SA数组,求满足SA[]的一个原字符串(每个字符为小写字母),无解输出-1. \(Solution\) 假设我们现在有suf(SA[j]),要构造suf( ...
- bzoj 4319 cerc2008 Suffix reconstruction——贪心构造
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4319 如果字符集有 5e5 那么大的话,挨个填上去就行了.但只有26个字符,所以要贪心地尽量 ...
- [CERC 2008] Suffix reconstruction
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4319 [算法] 首先 , 我们可以求出这个字符串的rank数组 按照SA逐位枚举 , ...
- bzoj 4319 Suffix reconstruction —— 贪心构造
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4319 思维还是不行...这样的构造都没思路... 首先,我们可以按 rank 的顺序从小到大 ...
- 【bzoj4319】cerc2008 Suffix reconstruction 贪心
题目描述 话说练习后缀数组时,小C 刷遍 poj 后缀数组题, 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺手牵羊,小C 程序中的原字符数组就被牵走了.幸运的是,小 ...
- 【CERC2008】【BZOJ4319】Suffix reconstruction
Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题. 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊.小C 程序中的原字符数组就被牵走 ...
- bzoj 4319: cerc2008 Suffix reconstruction 贪心
如果字符集无限大的话直接按照 $sa$ 的顺序依次填即可. 由于字符集非常小,所以要尽量填相同的字符. 我们知道 $sa$ 数组,也就知道了 $rank$ 数组. 那么考虑添加排名为 $i$ 的字符: ...
随机推荐
- Event log c++ sample.
1. Init regedit. bool InitLog( TCHAR *logName, TCHAR *sourceName, TCHAR *MessageDllName ) { // This ...
- Careercup - Microsoft面试题 - 5485521224597504
2014-05-12 06:19 题目链接 原题: Given an input list of lists.. flatten the list. For e.g. {{,}, {}, {,}} . ...
- putty的基本使用
1.输入你要连接的目标的IP地址,输入你要给它取的名字,点击保存 2.选中你保存的会话,点击打开,即可打开会话 3.输入你连接的目标的用户账号,回车,再输入密码.即可正常使用. 4.编码的设置 在出现 ...
- 区分 Cookie, LocalStorage 与 SessionStorage
基本概念 Cookie Cookie 的大小限制为4KB左右,是网景公司的前雇员 Lou Montulli 在1993年3月的发明.它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码 ...
- 07 JVM 是如何实现反射的
Java 中的反射 反射是 Java 语言的一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为. 我们可以通过 Class 对象枚举该类中的所有方法,还可以通过 Met ...
- 【LeetCode】Longest Substring Without Repeating Characters(无重复字符的最长子串)
这道题是LeetCode里的第3道题. 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: ...
- LAMP第二部分apache的配置
1. 下载discuz! mkdir /data/wwwcd /data/wwwmv /root/Discuz_X3.2_SC_GBK.zip .wget http://download.comsen ...
- BZOJ 3876 支线剧情(有上下界的无源汇最小费用可行流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1783 Solved: 1079 [Submit][St ...
- [luoguP2224] [HNOI2001]产品加工(背包DP)
传送门 f[i][j]表示第一个机器耗时j,第二个机器耗时f[i][j] 第一维可以滚掉 #include <cstdio> #include <cstring> #inclu ...
- 论文笔记《Fully Convolutional Networks for Semantic Segmentation》
一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...