题目:戳这里
题意:给1e5个字符串,问有多少对字符串组合,满足最多只有一种字符有奇数个。
解题思路:每种情况用map存一下就行了。感觉这题自己的代码思路比较清晰,所以写个题解记录一下
附ac代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 2e5 + 10; 5 const ll mod = 998244353; 6 int arr[33]; 7 int nu[maxn]; 8 int now; 9 string st; 10 map<int, int> mp; 11 int main() { 12 ios::sync_with_stdio(false); 13 int n; 14 cin>>n; 15 for(int i = 1; i <= n; ++i) { 16 memset(arr,0,sizeof(arr)); 17 cin>>st; 18 now=0; 19 for(int j = 0; j < st.size(); ++j) { 20 arr[st[j]-'a']++; 21 } 22 for(int j = 0; j < 26; ++j) { 23 if(arr[j]&1) now += 1<<j; 24 } 25 ++mp[now]; 26 nu[i] = now; 27 } 28 29 int od = 0; 30 ll ans = 0; 31 32 for(int i = 1; i <= n; ++i) { 33 od = 0; 34 for(int j = 0; j < 26; ++j) { 35 if(nu[i]&(1<<j)) ++od; 36 } 37 if(od == 0) { 38 ans += mp[nu[i]] - 1; 39 for(int j = 0; j < 26; ++j) { 40 ans += mp[1<<j]; 41 } 42 } 43 else { 44 ans += mp[nu[i]] - 1; 45 for(int j = 0; j < 26; ++j) { 46 ans += mp[nu[i]^(1<<j)]; 47 } 48 } 49 } 50 printf("%lld ", ans / 2ll); 51 return 0; 52 }