题目链接

\(Description\)

给定SA数组,求满足SA[]的一个原字符串(每个字符为小写字母),无解输出-1.

\(Solution\)

假设我们现在有suf(SA[j]),要构造suf(SA[i]) (要满足i>j)

考虑后缀的比较方式,先比较第一位,再比较suf(SA[i]+1)与suf(SA[j]+1)

若suf(SA[i]+1)>suf(SA[j]+1),则两字符串第一位可以相同;否则一定要在第一位满足suf(SA[i])>suf(SA[j])

按照这种方式构造,就能保证尽可能多的重复使用字母

如何比较suf(SA[i]+1)与suf(SA[j]+1)?不要忘了给了SA是可以求rk的。。比较rk即可。

无解即使用字符种数超过了小写字母个数

//6680kb	576ms
#include <cstdio>
#include <cctype>
#define gc() getchar()
const int N=5e5+5; int n,sa[N],rk[N],A[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
n=read();
for(int i=1; i<=n; ++i) sa[i]=read();
for(int i=1; i<=n; ++i) rk[sa[i]]=i;
int x=0; A[sa[1]]=x;
for(int i=2; i<=n&&x<26; ++i)
if(rk[sa[i-1]+1]<rk[sa[i]+1]) A[sa[i]]=x;
else A[sa[i]]=++x;
if(x>=26) printf("-1");
else
for(int i=1; i<=n; ++i) printf("%c",A[i]+'a'); return 0;
}

BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)的更多相关文章

  1. BZOJ 4319: cerc2008 Suffix reconstruction(后缀数组)

    题面 Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题, 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊,小C 程序中的原字符数组就 ...

  2. bzoj 4319: Suffix reconstruction 后缀数组+构造

    题目大意 给定后缀数组sa,要求构造出满足sa数组的字符串.或输出无解\(n\leq 5*10^5\) 题解 我们按照字典序来考虑每个后缀 对于\(Suffix(sa[i])\)和\(Suffix(s ...

  3. bzoj 4319 cerc2008 Suffix reconstruction——贪心构造

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4319 如果字符集有 5e5 那么大的话,挨个填上去就行了.但只有26个字符,所以要贪心地尽量 ...

  4. bzoj 4319: cerc2008 Suffix reconstruction 贪心

    如果字符集无限大的话直接按照 $sa$ 的顺序依次填即可. 由于字符集非常小,所以要尽量填相同的字符. 我们知道 $sa$ 数组,也就知道了 $rank$ 数组. 那么考虑添加排名为 $i$ 的字符: ...

  5. BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)

    BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...

  6. suffix array后缀数组

    倍增算法 基本定义子串:字符串 S 的子串 r[i..j],i≤j,表示 r 串中从 i 到 j 这一段也就是顺次排列 r[i],r[i+1],...,r[j]形成的字符串. 后缀:后缀是指从某个位置 ...

  7. 【题解】回文串 APIO 2014 BZOJ 3676 COGS 1985 Manacher+后缀数组+二分

    这题可以用回文自动机来做,但是我并没有学,于是用Manacher+SA的做法O(nlogn)水过 首先,看到回文串就能想到用Manacher 同样还是要利用Manacher能不重复不遗漏地枚举每个回文 ...

  8. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  9. bzoj 3172 单词 ac自动机|后缀数组

    题目大意: 给定n个字符串连成了一篇文章,问每个字符串在这篇文章中出现的次数,可重复覆盖 这里ac自动机和后缀数组都可以做 当然后缀数组很容易就解决,但是相对时间消耗高 这里就只讲ac自动机了 将每个 ...

随机推荐

  1. Word打开默认显示缩略图,而不是文档结构图

    So easy! 1.打开Word文档,点击缩略图右侧的"X",关闭缩略图: 2.打开菜单[视图],勾选"文档结构图": 3.关闭当前Word文档: 4.再次打 ...

  2. eclipse自定义工具栏

    设置:1.Window2.Customize Perspective说明:Tool Bar Visibility定义菜单栏,Shortcuts定义右键new菜单

  3. centos6.7安装系统后看不到网卡无法配置IP的解决办法

    新安装centos6.7后发现/etc/sysconfig/network-scripts目录下没有eth0的网卡配置,通过ifconfig可以看到eth0的硬件地址 于是新建网卡输入一下内容 # c ...

  4. 前端开发必须知道的JS之闭包及应用

    本文讲的是函数闭包,不涉及对象闭包(如用with实现).如果你觉得我说的有偏差,欢迎拍砖,欢迎指教. 在前端开发必须知道的JS之原型和继承一文中说过下面写篇闭包,加之最近越来越发现需要加强我的闭包应用 ...

  5. LeetCode(57):插入区间

    Hard! 题目描述: 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: i ...

  6. PHP将数据写入指定文件中

    首先创建一个空的txt文件,这里我们创建了一个1.txt的空文件. 第一种方法:fwrite函数 <?php $file=fopen('1.txt','rb+'); var_dump(fwrit ...

  7. 性能测试十五:liunx下搭建(tomcat+项目+jmete命令行)

    单机 准备工作: 1.压力机安装并配置好JDK,输入java和javac验证环境变量 2.上传jmeter到liunx下: 准备好jmeter的压缩包 在第三方工具中对linux文件上传下载(需先装好 ...

  8. Bootstrap案例中,登陆界面自适应

    1.html布局源码: <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  9. bzoj 4503

    没有权限号就只能对拍了 我们令?代表的T值=0,然后设出这样一个式子 这样一来,只要T和S在j位置匹配,当且仅当Dj=0,然后我们将这个式子拆开,变成下面那样 思路大概就是这样 最后发现答案应该是在a ...

  10. [转]svn检出的时候报 Unable to connect to a repository at URL错误

    昨天晚上遇到的问题: 在同一个SVN地址下,很多子目录,各种目录各种权限,现在因为业务,需要下载各种目录下的文件. 第一次遇到这个问题..现象是: 1)在web浏览器下可用: 2)在本地创建的目录下c ...