codeforces 1669E

2023-12-31 12:45:51

很难过,本来打算今天出去 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 ak组成,问对应位置恰好有一个不一样的字符串有多少个

思路

开两个 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就是多出来的只有一个相同的数量

ACcode


#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;
}

文章来源:https://blog.csdn.net/weixin_70831807/article/details/135314160
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。