当前位置:首页 > 洛谷题解 > 洛谷P1184:从零开始理解字符串匹配与哈希集合的实战应用

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

1个月前 (07-27)洛谷题解94

截图未命名.jpg 洛谷P1184:从零开始理解字符串匹配与哈希集合的实战应用 第1张


一、问题本质分析

题目要求我们统计在m天中,高手和小萝莉出现在相同地点的天数。关键在于高效判断一个地点是否在高手可去的地点集合中。

二、核心算法选择

  1. 哈希集合‌:使用unordered_set存储可去地点,实现O(1)时间复杂度的查询

  2. 整行读取‌:使用getline处理可能包含空格的地名

  3. 输入优化‌:ios::sync_with_stdio加速IO

三、关键技术点详解

  1. 输入处理技巧‌:

    • cin.ignore()清除缓冲区残留的换行符

    • getline完整读取含空格字符串

    • 同步关闭提升IO速度

  2. 数据结构选择‌:

    • unordered_set基于哈希表实现

    • 平均查询时间复杂度O(1)

    • 比set更高效(set是O(logn))

  3. 边界情况处理‌:

    • 空地名处理

    • 重复地名自动去重

    • 大小写敏感比较(题目未说明视为敏感)

四、代码实现

#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;
}

五、代码优化建议

  1. 可添加地点名称标准化处理(如转小写)

  2. 对于超大数据可使用Bloom Filter

  3. 多线程处理大规模数据

六、学习价值

通过这个简单问题,我们可以掌握:

  1. 标准库容器的选择策略

  2. 字符串处理的注意事项

  3. 算法复杂度的实际评估

  4. 输入输出优化技巧

参考:洛谷1184题解

原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。