Codeforces-2-Letter Strings(题解)

这篇文章讨论了解决Codeforces中的一个问题,如何计算给定n对只有两个字符的字符串中,仅有一个字符不同的字符串对的数量。通过使用map数据结构存储每个字符和字符串的出现次数,作者提供了C++代码实现这一计数过程。
摘要由CSDN通过智能技术生成

Codeforces-2-Letter Strings

题意

多样例,给你n对字符串,每对字符串只有两个字符,判断只有一个字符不相同的字符串对数是多少

题解

只有一个字符不同,可以每次加上第一个字符为首形成的字符串和第二个字符为尾在此之前出现的次数,最后注意去重,因为只能有一个字符,如果输入相同的字符串,就会有重复。去重也很简单,只用减去 这个字符在此之前出现的次数的2倍,为什么是2倍,因为 加上了第一个字符为首的字符串个数 又 加上了第二个字符为尾的字符串个数。

代码

#include<iostream>
#include<map>
using namespace std;
int t,n;
string str;

int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> t;
	while(t--){
		map<char,int>s1,s2;
		map<string,int>ss;
		long long cnt = 0;
		cin >> n;
		while(n--){
			cin >>str;
			cnt += s1[str[0]]; // 加上 1 号位相同的
			cnt += s2[str[1]]; // 加上 2 号位相同的
			cnt -= ss[str] << 1; // 自己跟自己的 1 号位 2 号位相等
			s1[str[0]]++;
			s2[str[1]]++;
			ss[str]++;
		}
		cout << cnt << endl;
	}
	
	return 0;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值