#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned int uint; typedef unsigned char uchar; typedef unsigned long long ulonglong; typedef vector::iterator iter; typedef map< uint, set >::iterator pairiter; typedef set::iterator setiter; bool hasInput(); void readInput(); void calculate(); void writeOutput(); void reset(); uint N = 0; vector list1, list2, list3; //set set1, set2, set3; map< uint,set > pairs; ulonglong result = 0; int main(int argc, char **argv) { list1.reserve(150000); list2.reserve(150000); list3.reserve(150000); while (true) { reset(); if (!hasInput()) break; readInput(); calculate(); writeOutput(); } return 0; } void reset() { N = 0; result = 0; pairs.clear(); list1.clear(); list2.clear(); list3.clear(); // set1.clear(); // set2.clear(); // set3.clear(); } bool hasInput() { cin >> N; return N > 0; } void readInput() { uint num; for (uint i = 0; i < N; ++i) { cin >> num; list1.push_back(num); } for (uint i = 0; i < N; ++i) { cin >> num; list2.push_back(num); } for (uint i = 0; i < N; ++i) { cin >> num; list3.push_back(num); } } uint indexof(vector& vec, uint val) { return find(vec.begin(), vec.end(), val) - vec.begin(); } void insert(uint a, uint b) { set& aset = pairs[a]; if (aset.find(b) == aset.end()) { aset.insert(b); ++result; for (pairiter it = pairs.begin(); it != pairs.end(); ++it) { set& s = it->second; if (s.find(a) != s.end()) insert(it->first, b); } set& bset = pairs[b]; for (setiter i = bset.begin(); i != bset.end(); ++i) { if (aset.find(*i) == aset.end()) insert(a, *i); } } } void calculate() { /* result = 0; set1.clear(); set1.insert(list1.begin(), list1.end()); for (uint i = 0; i < N; ++i) { uint num = list1[i]; set1.erase(num); if (set1.size() == 0) continue; set2.clear(); iter iter2 = find(list2.begin(), list2.end(), num); ++iter2; for (; iter2 != list2.end(); ++iter2) if (set1.find(*iter2) != set1.end()) set2.insert(*iter2); if (set2.size() == 0) continue; iter iter3 = find(list3.begin(), list3.end(), num); ++iter3; for (; iter3 != list3.end(); ++iter3) if (set2.find(*iter3) != set2.end()) ++result; }*/ result = 0; for (uint i = 0; i < N; ++i) { for (uint j = i+1; j < N; ++j) { uint a = list1[i]; uint b = list1[j]; set& aset = pairs[a]; if (aset.find(b) != aset.end()) continue; iter a2 = find(list2.begin(), list2.end(), a); ++a2; iter b2 = find(a2, list2.end(), b); if (b2 == list2.end()) continue; iter a3 = find(list3.begin(), list3.end(), a); ++a3; iter b3 = find(a3, list3.end(), b); if (b3 == list3.end()) continue; insert(a,b); } } } void writeOutput() { cout << result << endl; }