构造

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");
}
View Code

 

posted @ 2015-11-24 21:37  Rivendell  阅读(317)  评论(0编辑  收藏  举报