codeforce1046 H. Palindrome Pairs 二進位制+map
阿新 • • 發佈:2018-12-11
求組成迴文串的對數(字元任意排列)
#include<bits/stdc++.h> using namespace std; const int MAXN=1e6+5; int n,l; char s[MAXN]; map<long long,long long>mp; map<long long,long long>::iterator p; int main() { while(~scanf("%d",&n)) { mp.clear(); for(int i=0;i<n;++i) { scanf("%s",s); l=strlen(s); long long xx=0; for(int j=0;j<l;++j) { long long x=1<<(s[j]-'a'); if(xx&x) xx-=x; else xx+=x; } if(mp.find(xx)!=mp.end()) ++mp[xx]; else mp[xx]=1; } long long ans=0; while(!mp.empty()) { p=mp.begin(); long long x=p->first,y=p->second,z=0; mp.erase(p); for(int j=0;j<26;++j) { long long k=1<<j; if(x&k) { if(mp.find(x-k)!=mp.end()) z+=mp[x-k]; } else { if(mp.find(x+k)!=mp.end()) z+=mp[x+k]; } } ans+=y*z+y*(y-1)/2; } printf("%lld\n",ans); } return 0; }