很难过,本来打算今天出去
c
i
t
y
w
a
l
k
citywalk
citywalk的,但是早上起来天阴的不行,看天气预备还下雾,就推迟了,继续来机房罚坐
结果卡住了…一开始想到了的想分别存起来字母,之前做过类似的,字母数量少,想用
m
a
p
map
map里混一个
v
e
c
t
o
r
vector
vector记录数量,分别加减,后来编译不过,估计是哪个容器写错了,一看佬的思路,确实牛好吧,记录一下
题目链接
给定长度为 2 2 2的 n n n个字符串,每个字符串仅由 a 到 k a到k a到k组成,问对应位置恰好有一个不一样的字符串有多少个
开两个 m a p map map分别存第一个和第二个字符的数量 m p 1 , m p 2 mp1,mp2 mp1,mp2,再开一个 m a p map map存每个字符串的数量 m p mp mp,每次读取一个字符串,更新三个容器的数量,如果没有不同的,那么 m p 1 = m p , m p 2 = m p mp1=mp,mp2=mp mp1=mp,mp2=mp,显然针对每一个字符串, m p 1 + m p 2 ? m p ? 2 mp1+mp2-mp*2 mp1+mp2?mp?2就是多出来的只有一个相同的数量
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
int n;cin >> n;
map<char, int>mp1, mp2;
map<string, int>mp;
string str;
ll ans = 0;
mp1.clear();
mp2.clear();
mp.clear();
for (int i = 1;i <= n;i++) {
cin >> str;
ans += mp1[str[0]];
ans += mp2[str[1]];
ans -= mp[str] * 2;
mp1[str[0]]++;
mp2[str[1]]++;
mp[str]++;
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}