zoukankan      html  css  js  c++  java
  • 【CERC2008】【BZOJ4319】Suffix reconstruction

    Description

    话说练习后缀数组时,小C 刷遍 poj 后缀数组题。
    各类字符串题闻之丧胆。就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺
    手牵羊。小C 程序中的原字符数组就被牵走了。幸运的是。小C 早已经求出了 SA[],为了
    能东山再起,迅速 A 掉此题,他希望各位忠臣们能帮忙求出一组原字符数组的可行方案。


    知原字符数组由小写拉丁字母组成。

    且小C的SA[]也是有可能求错的。 原数组可能不存在。
    Input

    输入文件仅仅有一行且为用空格隔开的一个正整数 N。
    接下来一行有 N 个数,为 1~N 的排列。


    当中对于 100%的数据 N≤500000
    Output

    一行有 N 个小写拉丁字母。若不存在合法方案输出-1;
    Sample Input

    4

    2 3 4 1
    Sample Output

    dabc
    HINT

    Source

    鸣谢Claris提供SPJ

    由于有SPJ所以不虚
    尽量让构造出的那个字符串的字典序小的话,就能够随便构造了
    然后假设最大的字符超过了小写字母肯定就是不合法了

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 500010
    #define GET (ch>='0'&&ch<='9')
    using namespace std;
    int n;
    int sa[MAXN],rank[MAXN];
    char last='a',ch[MAXN];
    void in(int &x)
    {
        char ch=getchar();x=0;
        while (!GET)    ch=getchar();
        while (GET) x=x*10+ch-'0',ch=getchar();
    }
    int main()
    {
        in(n);
        for (int i=1;i<=n;i++)  in(sa[i]),rank[sa[i]]=i;
        ch[sa[1]]=last;
        for (int i=2;i<=n;i++)
        {
            if (rank[sa[i-1]+1]>rank[sa[i]+1])  last++;
            if (last>'z')   {puts("-1");return 0;}
            ch[sa[i]]=last;
        }
        for (int i=1;i<=n;i++)  putchar(ch[i]);
    }
  • 相关阅读:
    在win2003中发布部署vs2010b2写的mvc2网站
    安装blender2.5Alpha0
    Win7下虚拟机个人使用小结:Virtual PC,VMware和VirtualBox
    ASP.NET AJAX Control Toolkit Beta 0911 发布[再增两控件]
    Camtasia 6录屏时鼠标闪烁问题解决
    为XNA制做安装程序(四)WIX Toolset 3.0 for Visual Studio 2008
    Oracle EM 12c
    无题
    从徐汇到虹口
    近况
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7157591.html
Copyright © 2011-2022 走看看