L2-002 連結串列去重
阿新 • • 發佈:2022-03-14
#include <bits/stdc++.h> using namespace std; bool st[100010]; int main() { ios::sync_with_stdio(false); cin.tie(0); string init; int n; cin >> init >> n; map<string, pair<int, string>> link; vector<tuple<string, int, string>> all; for (int i = 0; i < n; i++) { string address, ne; int val; cin >> address >> val >> ne; link[address] = {val, ne}; } string curadd = init; while (true) { all.push_back({curadd, link[curadd].first, link[curadd].second}); if (link[curadd].second == "-1") break; curadd = link[curadd].second; } vector<tuple<string, int, string>> del; vector<tuple<string, int, string>> after; for (int i = 0; i < all.size(); i++) { //刪除重複結點 //cout << get<0>(all[i]) << " " << get<1>(all[i]) << " " << get<2>(all[i]) << "\n"; string add = get<0>(all[i]), ne = get<2>(all[i]); int val = get<1>(all[i]); if (st[abs(val)]) { //如果已經出現過 del.push_back({add, val, ne}); } else { st[abs(val)] = true; after.push_back({add, val, ne}); } } for (int i = 0; i < after.size(); i++) { string add = get<0>(after[i]), ne = get<2>(after[i]); int val = get<1>(after[i]); if (i == after.size() - 1) { //當前是最後一個結點 結尾為-1 after[i] = {add, val, "-1"}; } else { if (ne != get<0>(after[i + 1])) { after[i] = {add, val, get<0>(after[i + 1])}; } } } for (int i = 0; i < del.size(); i++) { string add = get<0>(del[i]), ne = get<2>(del[i]); int val = get<1>(del[i]); if (i == del.size() - 1) { //當前是最後一個結點 結尾為-1 del[i] = {add, val, "-1"}; } else { if (ne != get<0>(del[i + 1])) { del[i] = {add, val, get<0>(del[i + 1])}; } } } for (int i = 0; i < after.size(); i++) { string add = get<0>(after[i]), ne = get<2>(after[i]); int val = get<1>(after[i]); cout << add << " " << val << " " << ne << "\n"; } for (int i = 0; i < del.size(); i++) { string add = get<0>(del[i]), ne = get<2>(del[i]); int val = get<1>(del[i]); cout << add << " " << val << " " << ne << "\n"[i == del.size() - 1]; } return 0; }