Judging
Time Limit: 20 Sec Memory Limit: 256 MB
题目连接
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=114147
Description
Input
The input consists of:
one line with one integer n (1≤n≤105), the number of submissions;
n lines, each with a result of the judging by DOMjudge, in arbitrary order;
n lines, each with a result of the judging by Kattis, in arbitrary order.
Each result is a string of length between 5 and 15 characters (inclusive) consisting of lowercase letters.
Output
Output one line with the maximum number of judging results that could have been the same for both systems.
Sample Input
5
correct
wronganswer
correct
correct
timelimit
wronganswer
correct
timelimit
correct
timelimit
Sample Output
4
题意:两个集合,每个集合分别N个字符串,每个集合相同的算一对,问有多少对。
题解:hash处理然后map记录即可,也可以直接mao存string,hash得双hash,会卡BKDRHash。
AC代码:
/*
* @Author: 王文宇
* @Date: 2018-06-26 01:37:59
* @Last Modified by: 王文宇
* @Last Modified time: 2018-06-26 02:04:40
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100006;
#define _for(i,a,b) for(int i=a;i<=b;i++)
typedef long long ll;
typedef pair<int,int> P;
int n;
map<P,int> Q;
int get_hash(char *key)
{
ll N=1998585857;
long long h=0;
while(*key)
h=(h*127+(*key++)+N)%N;
return h%N;
}
int get_hash2(char *key)
{
ll N=127398127;
long long h=0;
while(*key)
h=(h*127+(*key++)+N)%N;
return h%N;
}
int main(int argc, char const *argv[])
{
while(scanf("%d",&n)!=EOF)
{
Q.clear();
_for(i,1,n)
{
char s[20];
P p;
cin>>s;
p.first = get_hash(s);
p.second = get_hash2(s);
Q[p]++;
}
int ans = 0;
_for(i,1,n)
{
char s[20];
P p;
cin>>s;
p.first = get_hash(s);
p.second = get_hash2(s);
if(Q[p]>0)
{
Q[p]--;
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}