1. 程式人生 > >codeforces 1045I Palindrome Pairs 【stl+構造】

codeforces 1045I Palindrome Pairs 【stl+構造】

codeforce ac代碼 技術 ref lld namespace set force img

題目:戳這裏

題意:給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\n", ans / 2ll); 51 return 0; 52 }
View Code

codeforces 1045I Palindrome Pairs 【stl+構造】