L2-002 链表去重

#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;
}
posted @ 2022-03-14 22:14  Xxaj5  阅读(24)  评论(0编辑  收藏  举报