1. 程式人生 > 其它 >CF50B Choosing Symbol Pairs 題解

CF50B Choosing Symbol Pairs 題解

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