UCF Local Programming Contest B.SGA President


问题链接:B.SGA President私の解法:试合をする时、自分で大丈夫だと思って、しかしずっとwa、waは4、5回、しかしやはり问题を発见していないで、方法は比较的に愚かですが、しかしどうにか答えを解くことができます(いくつかのデータをテストして问题がありません)...
#include 
#include 
#include 
const int N = 100000 + 5;
using namespace std;
int n;
string s[N];

int main()
{
	cin >> n;
	for(int i = 0; i < n; ++i) cin >> s[i];
	if(n <= 0) {
		cout << "0" << endl;
		return 0;
	}
	int ans = 0; //  
	int a[35], b[35], cnt = 0;
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b)); //    
	sort(s, s + n); //   
	a[s[0][0] - 'A']++;
	for(int i = 1; i < n; ++i) {
		a[s[i][0] - 'A']++; 
		if(s[i] == s[i - 1]) b[s[i - 1][0] - 'A']++; //   
	}
	long long sum = 0;
	for(int i = 0; i <= 25; ++i) {
		if(a[i] >= 2) {
			sum += (long long)a[i] * (a[i] - 1);
			sum -= (long long)b[i] * (b[i] + 1);	
		}
	}
	cout << sum << endl;
	return 0;
}

実は私とあまり差がありません.mapを1つ使って、同じ文字列の個数を統計して、同じアルファベットの冒頭の遍数を1つの配列で統計して、for()は走りながら行けばいいです.
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int N = 100000 + 5;
int n;
string s[N];
map <string,int> mp; //  ,   
ll nm[30]; //   

int main()
{
	cin >> n;
	for(int i = 1; i <= n; ++i) {
		cin >> s[i];
		mp[s[i]]++;
		nm[s[i][0] - 'A']++;
	}
	ll ans = 0;
	for(int i = 1; i <= n; ++i) {
		ans += nm[s[i][0] - 'A'] - mp[s[i]];
	}
	//   
	cout << ans << endl;
	return 0;
}

指正を求める