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
| #include <bits/stdc++.h>
const long long IMX = 1ll << 30; const long long LMX = 1ll << 60;
typedef long long ll; typedef __int128 i128; typedef long double ld; typedef __float128 f128;
namespace xvl_ { #define SP(n, x) std :: setprecision(n) << std :: fixed << x #define REP(i, l, r) for (auto i = (l); i <= (r); i ++) #define PER(i, r, l) for (auto i = (r); i >= (l); i --) #define DEBUG(x) std :: cerr << #x << " = " << x << '\n' template <typename T> T Max(T a, T b) { return a > b ? a : b; } template <typename T, typename... Args> T Max(T a, Args... args) { return a > Max(args...) ? a : Max(args...); } template <typename T> T Min(T a, T b) { return a < b ? a : b; } template <typename T, typename... Args> T Min(T a, Args... args) { return a < Min(args...) ? a : Min(args...); } } using namespace std; using namespace xvl_; ll n, ans; ll cnt[200005][26]; string s[200005]; vector <ll> x; map <ll, ll> mp; int main() { ios :: sync_with_stdio(0); cin.tie(nullptr); cin >> n; REP(i, 1, n) { cin >> s[i]; REP(j, 0, s[i].size() - 1) cnt[i][s[i][j] - 'a'] ++; } REP(c, 0, 25) { mp.clear(), x.clear(); REP(i, 1, n) { if (cnt[i][c]) continue; x.push_back(0); REP(j, 0, 25) { if (j == c) continue; x[x.size() - 1] = (x[x.size() - 1] << 1) | (cnt[i][j] & 1); } } for (auto v : x) { mp[v] ++; ans += mp[v ^ (1 << 25) - 1]; } } cout << ans; return 0; }
|