智商不够,告辞。。
显然能够确定第一列上的字符。
这样我们知道某种字符的后一个字符可能是哪些。只要我们能把右边的字符映射到左边的字符上,这样我沿着 '.' 往后跳就能找出原串了。
我们考虑最后一列从上到下的第$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 }