bzoj 4104 [Thusc 2015] 解密运算 - 构造

题目传送门

  传送门

题目大意

  (原题题意很简洁)

  智商不够,告辞。。

  显然能够确定第一列上的字符。

  这样我们知道某种字符的后一个字符可能是哪些。只要我们能把右边的字符映射到左边的字符上,这样我沿着 '.' 往后跳就能找出原串了。

  我们考虑最后一列从上到下的第$k$个a,它后面的$n$个字符构成的字符串一定是对应第一列第$k$个a和后面$n - 1$组成的字符串。

  然后排一个序就能够计算了。

 1 /**
 2  * bzoj
 3  * Problem#4104
 4  * Accepted
 5  * Time: 996ms
 6  * Memory: 2856k
 7  */
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 typedef bool boolean;
11 
12 #define pii pair<int, int>
13 
14 int n;
15 pii *a;
16 
17 int main() {
18     scanf("%d%*d", &n);
19     a = new pii[(n + 1)];
20     for (int i = 0; i <= n; i++) {
21         scanf("%d", &a[i].first);
22         a[i].second = i;
23     }
24     sort(a, a + n + 1);
25     int cur = a[0].second;
26     for (int i = 1; i <= n; i++) {
27         printf("%d ", a[cur].first);
28         cur = a[cur].second;
29     }
30     return 0;
31 }

猜你喜欢

转载自www.cnblogs.com/yyf0309/p/10232437.html