版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/violinlove/article/details/83111505
传送门:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1095
解析
最终答案=单个字符串排序后 哈希值相同的个数 - 未排序时 字符串相同的个数
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#define LL long long
using namespace std;
const LL bse = 131;
const LL mod = 212370440130137957 ;
inline int wread(){
char c(getchar ());int wans(0),flag(1);
while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
void init (){
freopen ("A.in","r",stdin);
freopen ("A.out","w",stdout);
}
LL get_hash(char s[]){
int len(strlen(s));
LL ans(0);
for (int i(0);i<len;++i)
ans=(ans*bse+(LL)s[i])%mod;
return ans;
}
int n,m;
multiset <LL> cnt1;
multiset <LL> cnt2;
int main (){
// init ();
n=wread();
for (int i(1);i<=n;++i){
char c[14];
scanf ("%s",c);
cnt1.insert (get_hash(c));
sort (c,c+strlen (c));
cnt2.insert (get_hash(c));
}
m=wread();
while (m--){
char c[14];
scanf ("%s",c);
int num2(cnt1.count (get_hash(c)));
sort (c,c+strlen (c));
int num1(cnt2.count (get_hash(c)));
printf("%d\n",num1-num2);
}
return 0;
}