智商不夠,告辭。。
顯然能夠確定第一列上的字符。
這樣我們知道某種字符的後一個字符可能是哪些。只要我們能把右邊的字符映射到左邊的字符上,這樣我沿着 '.' 往後跳就能找出原串了。
我們考慮最後一列從上到下的第$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 }