codeforce1046 H. Palindrome Pairs
求组成回文串的对数(字符任意排列)
#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;
}