CF50B Choosing Symbol Pairs 題解
阿新 • • 發佈:2021-12-23
CF50B Choosing Symbol Pairs 題解
對。
Content
給定一個字串 \(s\),求有多少對是相同的(包括自己和自己這一對,\((x,y)\) 和 \((y,x)\) 是不相同的一對)。
資料範圍:\(1\leqslant |s|\leqslant 10^5\)。
Solution
這道題目需要證明一個東西:如果有 \(n\) 個相同的字母,那麼它們之間相同的對數就是 \(n^2\)。
證明:因為自己和自己算做一對,所以先有 \(n\) 對。
同時,又因為兩兩之間配對可以算作兩對,\(n\) 個字元兩兩配對就一共會有 \(\dfrac{n(n-1)}{2}\times2=n(n-1)\) 對。
所以,加起來一共會有 \(n+n(n-1)=n+n^2-n=n^2\)
證畢。
因此,我們需要統計一個字元出現的次數 \(n\),那麼它對於這個對數的貢獻就是 \(n^2\),對於每個字元的貢獻,我們累加起來,這樣得出的結果就是我們題目的答案了。
建議開兩個 \(\texttt{map}\),一個 \(\texttt{map}\) 用來儲存每個字元出現的次數,另一個 \(\texttt{map}\) 則用來判斷是否有重複(這樣就不會重複計算)。
Code
#include <cstdio> #include <algorithm> #include <map> #include <iostream> using namespace std; string s; map<char, long long> a, vis; long long sum; int main() { cin >> s; for(int i = 0; i < s.size(); ++i) a[s[i]]++; for(int i = 0; i < s.size(); ++i) { if(!vis[s[i]]) { sum += a[s[i]] * a[s[i]]; vis[s[i]] = 1; } } printf("%lld\n", sum); return 0; }