#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int cnt4[26][26][26][26];
int cnt2[4][26][26];
int main() {
int N;
cin >> N;
ll res = 0;
for (int i = 0; i < N; ++i) {
string s, t;
cin >> s >> t;
vector<int> a(4);
set<int> st;
for (int j = 0; j < 2; ++j) {
a[j] = (s[j] - 'A');
a[j + 2] = (t[j] - 'A');
}
for (auto& u : a) {
st.insert(u);
}
res += cnt2[2][a[0]][a[1]];
res += cnt2[0][a[2]][a[3]];
res += cnt2[1][a[1]][a[3]];
res += cnt2[3][a[0]][a[2]];
if (st.size() == 4) {
res -= cnt4[a[2]][a[3]][a[0]][a[1]];
res -= cnt4[a[1]][a[0]][a[3]][a[2]];
} else if (st.size() == 3) {
// AA : AA BC
// BC : CB AA
if (a[0] == a[1]) {
res -= cnt4[a[0]][a[0]][a[3]][a[2]];
res -= cnt4[a[2]][a[3]][a[0]][a[0]];
// AB : BA AC
// AC : CA AB
} else if (a[0] == a[2]) {
res -= cnt4[a[1]][a[0]][a[3]][a[0]];
res -= cnt4[a[0]][a[3]][a[0]][a[2]];
// BC : AA CB
// AA : BC AA
} else if (a[2] == a[3]) {
res -= cnt4[a[2]][a[2]][a[0]][a[1]];
res -= cnt4[a[1]][a[2]][a[2]][a[2]];
// BA : AB CA
// CA : AC BA
} else if (a[1] == a[3]) {
res -= cnt4[a[1]][a[0]][a[1]][a[2]];
res -= cnt4[a[2]][a[1]][a[0]][a[1]];
} else {
assert(false);
}
} else if (st.size() == 2) {
if ((a[0] == a[1] && a[2] == a[3])
|| (a[0] == a[2] && a[1] == a[3])) {
res -= cnt4[a[0]][a[1]][a[2]][a[3]];
if (a[0] == a[1]) {
res -= cnt4[a[2]][a[3]][a[0]][a[1]];
} else {
res -= cnt4[a[1]][a[0]][a[3]][a[2]];
}
} else if (a[0] == a[3]) {
res += cnt4[a[1]][a[0]][a[3]][a[2]];
// AB : BA B_ BA BA _A
// BA : AB AB A_ _B AB
for (int j = 0; j < 26; ++j) {
res -= cnt4[a[1]][j][a[0]][a[1]];
res -= cnt4[a[1]][a[0]][a[0]][j];
res -= cnt4[a[1]][a[0]][j][a[1]];
res -= cnt4[j][a[0]][a[0]][a[1]];
}
} else {
// AA : _A AA
// AB : AA BA
if (a[0] == a[1] && a[0] == a[2]) {
for (int j = 0; j < 26; ++j) {
res -= cnt4[j][a[0]][a[0]][a[0]];
}
res -= cnt4[a[0]][a[0]][a[1]][a[0]];
// AB : AA BA
// AA : _A AA
} else if (a[0] == a[2] && a[2] == a[3]) {
for (int j = 0; j < 26; ++j) {
res -= cnt4[a[0]][a[0]][j][a[0]];
}
res -= cnt4[a[2]][a[0]][a[0]][a[0]];
// BA : AB AA
// AA : AA A_
} else if (a[1] == a[2] && a[2] == a[3]) {
res -= cnt4[a[1]][a[0]][a[1]][a[1]];
for (int j = 0; j < 26; ++j) {
res -= cnt4[a[1]][a[1]][a[1]][j];
}
// AA : AA A_
// BA : AB AA
} else if (a[0] == a[1] && a[0] == a[3]) {
res -= cnt4[a[0]][a[0]][a[0]][a[2]];
for (int j = 0; j < 26; ++j) {
res -= cnt4[a[0]][j][a[0]][a[0]];
}
} else {
assert(false);
}
}
} else if (st.size() == 1) {
res += cnt4[a[0]][a[1]][a[2]][a[3]];
for (int j = 0; j < 26; ++j) {
res -= cnt4[a[0]][a[0]][a[0]][j];
res -= cnt4[j][a[0]][a[0]][a[0]];
res -= cnt4[a[0]][j][a[0]][a[0]];
res -= cnt4[a[0]][a[0]][j][a[0]];
}
} else {
assert(false);
}
// cout << res << endl;
cnt2[0][a[0]][a[1]]++;
cnt2[1][a[0]][a[2]]++;
cnt2[2][a[2]][a[3]]++;
cnt2[3][a[1]][a[3]]++;
cnt4[a[0]][a[1]][a[2]][a[3]]++;
}
cout << res << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |