題目:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3248
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <bits/stdc++.h> using namespace std;
stack<int> st; map<set<int>, int> mp; vector<set<int>> v; int id=0;
int getID(set<int> &s){ auto it = mp.find(s); if(it != mp.end()) return it->second;
v.push_back(s); return mp[s] = id++; }
int main(){ ios::sync_with_stdio(0); cin.tie(0); int kase; cin >> kase;
int n; string cmd; set<int> s; while(kase--){ cin >> n;
id = 0; while(!st.empty()) st.pop(); mp.clear(); v.clear();
while(n--){ s.clear(); cin >> cmd; char ch = cmd[0]; if(ch == 'P') st.push(getID(s)); else if(ch == 'D') st.push(st.top()); else{ int id1 = st.top(); st.pop(); int id2 = st.top(); st.pop();
if(ch == 'U'){ set_union(v[id1].begin(), v[id1].end(), v[id2].begin(), v[id2].end(), inserter(s, s.begin()));
} else if(ch == 'I'){ set_intersection(v[id1].begin(), v[id1].end(), v[id2].begin(), v[id2].end(), inserter(s, s.begin()));
} else{ s = v[id2]; s.insert(id1); } st.push(getID(s)); } cout << v[st.top()].size() << '\n'; } cout << "***\n"; } return 0; }
|