洛谷P1184:从零开始理解字符串匹配与哈希集合的实战应用

一、问题本质分析
题目要求我们统计在m天中,高手和小萝莉出现在相同地点的天数。关键在于高效判断一个地点是否在高手可去的地点集合中。
二、核心算法选择
哈希集合:使用unordered_set存储可去地点,实现O(1)时间复杂度的查询
整行读取:使用getline处理可能包含空格的地名
输入优化:ios::sync_with_stdio加速IO
三、关键技术点详解
输入处理技巧:
cin.ignore()清除缓冲区残留的换行符
getline完整读取含空格字符串
同步关闭提升IO速度
数据结构选择:
unordered_set基于哈希表实现
平均查询时间复杂度O(1)
比set更高效(set是O(logn))
边界情况处理:
空地名处理
重复地名自动去重
大小写敏感比较(题目未说明视为敏感)
四、代码实现
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
cin.ignore(); // 清除第一行的换行符
unordered_set<string> available;
// 读取高手能去的地点(可能有空格)
for(int i = 0; i < n; ++i) {
string place;
getline(cin, place);
available.insert(place);
}
int count = 0;
// 读取她的每日行程并统计匹配天数
for(int i = 0; i < m; ++i) {
string place;
getline(cin, place);
if(available.find(place) != available.end()) {
++count;
}
}
cout << count << endl;
return 0;
}五、代码优化建议
可添加地点名称标准化处理(如转小写)
对于超大数据可使用Bloom Filter
多线程处理大规模数据
六、学习价值
通过这个简单问题,我们可以掌握:
标准库容器的选择策略
字符串处理的注意事项
算法复杂度的实际评估
输入输出优化技巧
参考:洛谷1184题解
原创内容 转载请注明出处
