这是在我决定当一个进击的程序员后刷的第一道题,虽然用哈希表一直没过,但是我觉得是有纪念意义的。
我要使用set容器来做这一题了!!!
#include
#include
#include
using namespace std;
int getkey(string name) {
int a = 378551;
int b = 63689;
int len, _key = 0;
len = name.length();
for (int i = 0; i < len; i++) {
_key = _key * a + name[i];
a = a * b;
}
return _key % 40000;
}
string trans(string name) {
int len = name.length();
string result;
for (int i = 0; i < len; i++) {
result.push_back(tolower(name[i]));
}
return result;
}
int main() {
int n, m;
while (cin >> n) {
if (n == 0) break; // The input is terminated by n=0.
cin >> m;
int count = 0; // count是发了信息的朋友数量
string hash[40000];
string name;
int key, t;
for (int i = 0; i < n; i++) {
cin >> name;
key = getkey(trans(name)) % 40000; // 取得哈希值
t = 1;
while (true) { // 建立哈希表
if (hash[key] == "") {
hash[key] = name;
break;
}
else {
key = (key + t * 378551) % 40000;
t++;
}
} // end while
} // end for
for (int j = 0; j < m; j++) {
string sender;
cin >> sender;
key = getkey(trans(name)) % n;
t = 0;
while (true) {
if (hash[key] == sender) {
count++;
hash[key] = "";
break;
}
else if (hash[key] == "") {
break;
}
else{
key = (key + t * 378551) % 40000;
t++;
}
} // end while
} // end for
delete hash;
cout << n - count << endl; // 输出剩余没发过信息的朋友数
}
return 0;
}