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]);
    }
  • 相关阅读:
    mysql事务隔离级别回顾
    单链表倒数第K个节点的查找和显示
    mysql 行转列,对列的分组求和,对行求和
    获取分组后统计数量最多的纪录;limit用法;sql执行顺序
    You can't specify target table 'e' for update in FROM clause
    mysql 行转列 (结果集以坐标显示)
    springmvc执行流程 源码分析
    jdk动态代理 案例
    项目日志log管理
    apache和tomcat的区别
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7157591.html
Copyright © 2011-2022 走看看