构造
bzoj4319 Suffix reconstruction
题目大意:给定后缀数组的sa,求原数组(仅包含小写字母)的一种方案,无解输出-1。
思路:考虑sa[i]和sa[i-1],如果在原数组中sa[i]+1的排名>sa[i-1]+1的排名,sa[i]和sa[i-1]就可以是一样的字母,从小字母向大里取,如果超过26个字母就是无解。(一开始的时候有很多问题没有考虑到,以后还要仔细想过之后在写,多想反例。)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxm 500005 using namespace std; int ai[maxm]={0},ans[maxm]={0},bi[maxm]={0}; int main(){ int i,j,ci,n;scanf("%d",&n); for (i=1;i<=n;++i){ scanf("%d",&ai[i]);bi[ai[i]]=i; }ans[ans[1]]=ci=0; for (i=2;i<=n;++i){ if (bi[ai[i]+1]>bi[ai[i-1]+1]) ans[ai[i]]=ci; else ans[ai[i]]=++ci; }if (ci>=26) printf("-1"); else for (i=1;i<=n;++i) printf("%c",ans[i]+'a'); printf("\n"); }