Submission #1166309

#TimeUsernameProblemLanguageResultExecution timeMemory
1166309tamyteCards (LMIO19_korteles)C++17
0 / 100
229 ms5632 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N;
    cin >> N;
    
    ll ans = 0;
    // Maps for individual edges:
    unordered_map<string, ll> cntTop, cntBottom, cntLeft, cntRight;
    // Maps for intersections:
    // cntLT: for a card’s (left, top) pair
    // cntRB: for a card’s (right, bottom) pair
    unordered_map<string, ll> cntLT, cntRB;
    
    for (int i = 0; i < N; i++){
        string s, t;
        cin >> s >> t;
        // Decompose the card.
        string top = s;       // first row
        string bottom = t;    // second row
        
        string left = "";
        left.push_back(s[0]);
        left.push_back(t[0]);
        
        string right = "";
        right.push_back(s[1]);
        right.push_back(t[1]);
        
        // Count potential matches from previously seen cards:
        ll horizontal = cntLeft[right] + cntRight[left];
        ll vertical   = cntTop[bottom] + cntBottom[top];
        
        // A pair is double counted if a previous card has:
        //   (left, top) equal to (current card's right, current card's bottom)
        // or (right, bottom) equal to (current card's left, current card's top).
        string key1 = right + bottom;
        ll inter1 = cntLT[key1];
        string key2 = left + top;
        ll inter2 = cntRB[key2];
        
        // The current card contributes (after dividing by 2 to account for order)
        ll contr = (horizontal + vertical - inter1 - inter2) / 2;
        ans += contr;
        
        // Update maps with the current card.
        cntTop[top]++;
        cntBottom[bottom]++;
        cntLeft[left]++;
        cntRight[right]++;
        cntLT[left + top]++;    // store the (left, top) pair for this card
        cntRB[right + bottom]++; // store the (right, bottom) pair for this card
    }
    
    cout << ans << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...