BZOJ 4104 [Thu Summer Camp 2015]解密运算

49 篇文章 1 订阅

恩。。夏令营。。

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 200001;
#define FOR(i, j, k) for (i = j; i <= k; i ++)
int a[N], b[N], c[N], d[N], e[N];


bool cmp(int x, int y) {
    if (a[x] != a[y])
        return a[x] < a[y];
    else if (b[x] != b[y])
        return b[x] < b[y];
    else
        return x < y;
}


int main() {
    int i, n, m, x = 0;
    scanf("%d%d", &n, &m);
    FOR(i,0,n) scanf("%d", &a[i]), b[i] = a[i], c[i] = i;
    sort(b, b + n + 1); sort(c, c + n + 1, cmp);
    FOR(i,0,n) d[c[i]] = i;
    for (i = n - 1; i >= 0; i--) e[i] = a[x], x = d[x];
    FOR(i,0,n-1) printf("%d ", e[i]);
    return 0;
}


4104: [Thu Summer Camp 2015]解密运算

Time Limit: 10 Sec   Memory Limit: 512 MB
Submit: 155   Solved: 94
[ Submit][ Status][ Discuss]

Description

 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符"."。之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串。

比如对于字符串“ABCAAA”,我们可以得到这N+1个串:
ABCAAA.
BCAAA.A
CAAA.AB
AAA.ABC
AA.ABCA
A.ABCAA
.ABCAAA
接着我们对得到的这N+1个串按字典序从小到大进行排序(注意特殊字符“.”的字典序小于任何其他的字符)结果如下:
.ABCAAA
A.ABCAA
AA.ABCA
AAA.ABC
ABCAAA.
BCAAA.A
CAAA.AB
最后,将排序好的N+1个串的最后一个字符取出,按照顺序排成一个新的字符串,也就是上面这个表的最后一列,就是加密后的密文“AAAC.AB”。
请通过加密后的密文求出加密前的字符串。

Input

第一行有两个整数N,M,分别表示加密前的字符串长度和字符集大小,其中字符用整数1,2,3,...,M编号,添加的特殊字符“."用0编号。
第二行为N+1个整数,表示加密后的字符串。

Output

输出仅一行,包含N个整数,用空格隔开,依次表示加密前字符串中每个字符的编号。

Sample Input

6 3
1 1 1 3 0 1 2

Sample Output

1 2 3 1 1 1

HINT

 #i (i=1~4)    N=5*(i+1) M<=3



#5~6    N,M<=50 字符串中字符互不相同


#7~8    N,M<=1000 字符串中字符互不相同


#9~12    N,M<=1000


#13~#20    N,M<=200000


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值