題目連結: https://zerojudge.tw/ShowProblem?problemid=e288
# 解題思路
可將第 n 位元作為有無對應角色的狀態。「1」代表有該角色,「0」代表沒有。|
可以做加法的運算, ^
可以用來判斷是否兩個 CP 間是否只有一組有該角色
(話說,這題 unorderd_set
比較快喔!)
(這是位元運算的基本題喔~)
# 程式碼
#include <bits/stdc++.h> | |
#include <unordered_set> | |
using namespace std; | |
#define spIO ios_base::sync_with_stdio(false);cin.tie(0) | |
typedef long long ll; | |
ll m, n; | |
unordered_multiset<ll> us; | |
vector<ll> v; | |
int main(){ | |
spIO; | |
cin >> m >> n; | |
string s; | |
ll t; | |
for (int i = 0; i < n; i++){ | |
cin >> s; t = 0; | |
for (int j = 0; j < s.size(); j++) | |
{ | |
if (s[j] <= 'Z') | |
t |= ((ll)1 << (s[j] - 'A')); | |
else | |
t |= ((ll)1 << (s[j] - 'a' + 26)); | |
} | |
us.insert(t); | |
v.push_back(t); | |
} | |
ll ans = 0, now; | |
for (int i = 0; i < n; i++) | |
{ | |
now = (((ll)1 << m) - 1) ^ v[i]; | |
ans += us.count(now); | |
} | |
cout << ans / 2; | |
} |