codeforces 1669E

很难过,本来打算今天出去 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+mp2mp2就是多出来的只有一个相同的数量

ACcode


#include

using namespace std;

using ll = long long;

void solve() {
    int n;cin >> n;
    mapmp1, mp2;
    mapmp;
    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;
}

你可能感兴趣的:(算法)