P3405 [USACO16DEC] Cities and States S
解题思路
这道题目要求找出满足特定条件的城市对:两个城市的前两个字母互为对方所在州的代码,并且来自不同的州。我们需要高效地统计这样的特殊城市对数。
方法思路
-
字符串处理:提取每个城市名称的前两个字母作为关键标识
-
哈希映射:使用map来记录州代码和城市前两字母的组合
-
配对统计:检查当前城市前两字母和州代码的反向组合是否已存在,存在则增加计数
代码注释
#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; }
代码解释
-
数据结构:使用map存储"州代码+城市前两字母"的组合及其出现次数
-
核心逻辑:
-
对于每个城市,提取前两字母
-
检查是否与州代码不同(避免同州匹配)
-
查找"城市前两字母+州代码"的组合是否已存在
-
记录"州代码+城市前两字母"的新组合
-
-
时间复杂度:O(n log n),主要来自map的插入和查找操作
-
空间复杂度:O(n),存储所有可能的组合
这种方法巧妙地利用字符串组合和哈希映射,高效地解决了特殊城市对的统计问题。

浙公网安备 33010602011771号