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]);
    }
  • 相关阅读:
    一个程序媛小渣的自我反省--纯属吐槽
    前端常见的性能优化手段
    js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计
    js-signals学习以及应用
    WebGL和ThreeJs学习6--射线法确定3D空间中所选物体
    前端之js-本地存储-localStorage && IndexedDB
    HelloStruts
    实验三 敏捷开发与XP实验 20175301李锦然实验报告
    《Java》第九周学习总结
    MYCP作业
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7157591.html
Copyright © 2011-2022 走看看