/*
QUESTION 5: Rebuilding the Hidden Order from Photos
Problem Statement:
You are given 5 photos of the same group.
Each photo contains the same N distinct IDs exactly once.
There is one hidden original order.
Each photo was formed from that original order by moving at most one ID
to another position.
Recover the original order.
Hard Constraints:
1 <= N <= 20000
Exactly 5 photos are given.
All IDs are distinct.
The answer is guaranteed to be unique.
Example:
photos =
[
[7, 3, 9, 1],
[3, 7, 9, 1],
[7, 9, 3, 1],
[7, 3, 1, 9],
[7, 3, 9, 1]
]
Expected Output:
7 3 9 1
Explanation:
For any two IDs, their correct relative order appears in most photos.
So majority comparison can rebuild the hidden order.
Brute Force:
Try every possible ordering.
Check whether each photo can be obtained by moving at most one element.
Time Complexity:
O(N!)
Optimized Approach:
For any two IDs x and y:
x should come before y if x appears before y in at least 3 out of 5 photos.
Sort one photo using this majority comparator.
Time Complexity:
O(N log N)
Space Complexity:
O(N)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> recoverOriginalOrder(vector<vector<int>>& photos) {
int k = 5;
int n = photos[0].size();
vector<unordered_map<int, int>> pos(k);
for (int p = 0; p < k; p++) {
for (int i = 0; i < n; i++) {
pos[p][photos[p][i]] = i;
}
}
vector<int> answer = photos[0];
sort(answer.begin(), answer.end(), [&](int a, int b) {
int count = 0;
for (int p = 0; p < k; p++) {
if (pos[p][a] < pos[p][b]) {
count++;
}
}
return count >= 3;
});
return answer;
}
};
int main() {
Solution sol;
vector<vector<int>> photos = {
{7, 3, 9, 1},
{3, 7, 9, 1},
{7, 9, 3, 1},
{7, 3, 1, 9},
{7, 3, 9, 1}
};
vector<int> ans = sol.recoverOriginalOrder(photos);
for (int x : ans) cout << x << " ";
cout << endl;
return 0;
}
LyoKUVVFU1RJT04gNTogUmVidWlsZGluZyB0aGUgSGlkZGVuIE9yZGVyIGZyb20gUGhvdG9zCgpQcm9ibGVtIFN0YXRlbWVudDoKWW91IGFyZSBnaXZlbiA1IHBob3RvcyBvZiB0aGUgc2FtZSBncm91cC4KCkVhY2ggcGhvdG8gY29udGFpbnMgdGhlIHNhbWUgTiBkaXN0aW5jdCBJRHMgZXhhY3RseSBvbmNlLgoKVGhlcmUgaXMgb25lIGhpZGRlbiBvcmlnaW5hbCBvcmRlci4KRWFjaCBwaG90byB3YXMgZm9ybWVkIGZyb20gdGhhdCBvcmlnaW5hbCBvcmRlciBieSBtb3ZpbmcgYXQgbW9zdCBvbmUgSUQKdG8gYW5vdGhlciBwb3NpdGlvbi4KClJlY292ZXIgdGhlIG9yaWdpbmFsIG9yZGVyLgoKSGFyZCBDb25zdHJhaW50czoKMSA8PSBOIDw9IDIwMDAwCkV4YWN0bHkgNSBwaG90b3MgYXJlIGdpdmVuLgpBbGwgSURzIGFyZSBkaXN0aW5jdC4KVGhlIGFuc3dlciBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4KCkV4YW1wbGU6CnBob3RvcyA9ClsKICBbNywgMywgOSwgMV0sCiAgWzMsIDcsIDksIDFdLAogIFs3LCA5LCAzLCAxXSwKICBbNywgMywgMSwgOV0sCiAgWzcsIDMsIDksIDFdCl0KCkV4cGVjdGVkIE91dHB1dDoKNyAzIDkgMQoKRXhwbGFuYXRpb246CkZvciBhbnkgdHdvIElEcywgdGhlaXIgY29ycmVjdCByZWxhdGl2ZSBvcmRlciBhcHBlYXJzIGluIG1vc3QgcGhvdG9zLgpTbyBtYWpvcml0eSBjb21wYXJpc29uIGNhbiByZWJ1aWxkIHRoZSBoaWRkZW4gb3JkZXIuCgpCcnV0ZSBGb3JjZToKVHJ5IGV2ZXJ5IHBvc3NpYmxlIG9yZGVyaW5nLgpDaGVjayB3aGV0aGVyIGVhY2ggcGhvdG8gY2FuIGJlIG9idGFpbmVkIGJ5IG1vdmluZyBhdCBtb3N0IG9uZSBlbGVtZW50LgoKVGltZSBDb21wbGV4aXR5OgpPKE4hKQoKT3B0aW1pemVkIEFwcHJvYWNoOgpGb3IgYW55IHR3byBJRHMgeCBhbmQgeToKeCBzaG91bGQgY29tZSBiZWZvcmUgeSBpZiB4IGFwcGVhcnMgYmVmb3JlIHkgaW4gYXQgbGVhc3QgMyBvdXQgb2YgNSBwaG90b3MuCgpTb3J0IG9uZSBwaG90byB1c2luZyB0aGlzIG1ham9yaXR5IGNvbXBhcmF0b3IuCgpUaW1lIENvbXBsZXhpdHk6Ck8oTiBsb2cgTikKClNwYWNlIENvbXBsZXhpdHk6Ck8oTikKKi8KCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU29sdXRpb24gewpwdWJsaWM6CiAgICB2ZWN0b3I8aW50PiByZWNvdmVyT3JpZ2luYWxPcmRlcih2ZWN0b3I8dmVjdG9yPGludD4+JiBwaG90b3MpIHsKICAgICAgICBpbnQgayA9IDU7CiAgICAgICAgaW50IG4gPSBwaG90b3NbMF0uc2l6ZSgpOwoKICAgICAgICB2ZWN0b3I8dW5vcmRlcmVkX21hcDxpbnQsIGludD4+IHBvcyhrKTsKCiAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBrOyBwKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIHBvc1twXVtwaG90b3NbcF1baV1dID0gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmVjdG9yPGludD4gYW5zd2VyID0gcGhvdG9zWzBdOwoKICAgICAgICBzb3J0KGFuc3dlci5iZWdpbigpLCBhbnN3ZXIuZW5kKCksIFsmXShpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKCiAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgazsgcCsrKSB7CiAgICAgICAgICAgICAgICBpZiAocG9zW3BdW2FdIDwgcG9zW3BdW2JdKSB7CiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvdW50ID49IDM7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBhbnN3ZXI7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIFNvbHV0aW9uIHNvbDsKCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHBob3RvcyA9IHsKICAgICAgICB7NywgMywgOSwgMX0sCiAgICAgICAgezMsIDcsIDksIDF9LAogICAgICAgIHs3LCA5LCAzLCAxfSwKICAgICAgICB7NywgMywgMSwgOX0sCiAgICAgICAgezcsIDMsIDksIDF9CiAgICB9OwoKICAgIHZlY3RvcjxpbnQ+IGFucyA9IHNvbC5yZWNvdmVyT3JpZ2luYWxPcmRlcihwaG90b3MpOwoKICAgIGZvciAoaW50IHggOiBhbnMpIGNvdXQgPDwgeCA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=