P3405 [USACO16DEC] Cities and States S

解题思路

这道题目要求找出满足特定条件的城市对:两个城市的前两个字母互为对方所在州的代码,并且来自不同的州。我们需要高效地统计这样的特殊城市对数。

方法思路

  1. 字符串处理:提取每个城市名称的前两个字母作为关键标识

  2. 哈希映射:使用map来记录州代码和城市前两字母的组合

  3. 配对统计:检查当前城市前两字母和州代码的反向组合是否已存在,存在则增加计数

代码注释

#include<bits/stdc++.h>
#define ll long long  // 定义长整型别名
using namespace std;
const int N = 2e5+10;  // 定义最大数据范围
map<string,int> vis;  // 使用map记录州代码和城市前两字母的组合
string a,b;  // a-城市名称,b-州代码
int n,ans;  // n-城市数量,ans-特殊城市对数

int main()
{
    cin >> n;  // 读取城市数量
    for(int i = 1; i <= n; i++)  // 循环处理每个城市
    {
        cin >> a >> b;  // 读取城市名称和州代码
        a = a.substr(0,2);  // 提取城市名称前两个字母
        
        // 只有当城市前两字母和州代码不同时才可能形成特殊对
        if(a != b)
            ans += vis[a + b];  // 查找是否有匹配的逆向组合
            
        vis[b + a]++;  // 记录当前州代码+城市前两字母的组合
    }
    cout << ans;  // 输出特殊城市对数
    return 0;
}

代码解释

  1. 数据结构:使用map存储"州代码+城市前两字母"的组合及其出现次数

  2. 核心逻辑

    • 对于每个城市,提取前两字母

    • 检查是否与州代码不同(避免同州匹配)

    • 查找"城市前两字母+州代码"的组合是否已存在

    • 记录"州代码+城市前两字母"的新组合

  3. 时间复杂度:O(n log n),主要来自map的插入和查找操作

  4. 空间复杂度:O(n),存储所有可能的组合

这种方法巧妙地利用字符串组合和哈希映射,高效地解决了特殊城市对的统计问题。

posted @ 2025-05-20 17:38  CRt0729  阅读(22)  评论(0)    收藏  举报