[题解]Cities and States-S

    科技2022-08-10  121

    题目描述 为了促进奶牛的智力发展, Farmer John 在牛棚的墙上放置了一幅很大的美国地图。在奶牛们花费 很多时间研究地图后,他们注意到一个奇特的现象。例如,有这样两个城市:弗林特(Flint),其州代 码为 MI,和迈阿密(Miami),州代码为 FL,他们之间存在一个特殊的关系: “弗林特”(Flint)的前两个 字母刚好是迈阿密的州代码(FL),同时迈阿密(Miami)前两个字母也刚好是弗林特的州代码(MI)。如果 两个来自不同州的城市满足这一属性,那我们就说这两个城市是特殊的一对。奶牛们想知道有多少对这 样的城市存在。请帮助他们解决这个有趣的地理难题! 输入 第 1 行输入地图上城市的个数 N; 接下去的 N 行,每行分别输入两个字符串。第一个表示城市名称(字符串由大写英文字母组成, 最少两 个,最多不能超过 10 个),第二个表示该城市的州代码(两个大写字母)。多个城市的名称允许相同,但 他们必须属于不同的州。 输出 输出共一行一个整数,满足条件的特殊城市对数。 样例输入 Copy 6 MIAMI FL DALLAS TX FLINT MI CLEMSON SC BOSTON MA ORLANDO FL 样例输出 Copy 1 提示 对于 20%的数据: 1≤N≤2,000; 对于 50%的数据: 1≤N≤25,000; 对于 100%的数据: 1≤N≤200,000;

    分析

    对于这道题,我们不妨考虑用 map \text{map} map来乱搞,因为数据范围只有 2e5 \text{2e5} 2e5. 输入再模拟题目过程即可。 注意,如果相同则跳过,否则更新答案;

    代码

    #include<iostream> #include<cstdio> #include<tr1/unordered_map> using namespace std; using namespace tr1; const int maxn = 2e5 + 5; unordered_map<int,int>ans[maxn]; int n,res=0; int main() { cin>>n; for(register int i=0; i<n; i++) { register string a,b; cin>>a>>b; register int c=a[0]*26+a[1]; register int d=b[0]*26+b[1]; if(c==d)continue; ans[c][d]++; res+=ans[d][c]; } cout<<res<<endl; return 0; }
    Processed: 0.009, SQL: 8