题海拾贝:P3405 [USACO16DEC] Cities and States S

         Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!

我的博客:<但凡.

我的专栏:《编程之路》《数据结构与算法之美》《题海拾贝》

欢迎点赞,关注!

1、题目

2、题解

       这个题有两个很巧妙的地方,第一,对于一个城市名来说,咱们比较的只是这个城市名字的前两个字母,所以说咱们干脆只计算,考虑这两个字母,当用string输入以后用substr裁剪一下。另外注意啊,substr裁剪是不改变原字符串的,所以咱们得写成s=s.substr(0, 2);。

        第二个比较巧妙的地方,就是咱们存储的时候把城市的前两个字符和州代号合成一个字符串来存储。需要注意的一点就是咱们不用先把所有的字符串都存进哈希表,再把反过来的字符串遍历一遍。如果这样做的话,咱们求得就不是对数了,而是对数*2。具体写法如下:

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
typedef long long LL;
unordered_map<string,int> mp;
int ret;//对数
int main()
{
	int line = 0;
	cin >> line;
	for (int i = 0;i < line;i++)
	{
		string s;string s1;
		cin >> s >> s1;
		s=s.substr(0, 2);//只要前两个字母
		if (s == s1)	
		{
			//如果s==s1,就算有匹配的上的,也是来自同一个州的
			continue;
		}
		//注意
		ret += mp[s1+s];
		mp[s + s1]++;
	}
	cout << ret << endl;
	return 0;
}

        好了,今天的内容就分享到这,我们下期再见!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值