洛谷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题解
原创内容 转载请注明出处