UCF Local Programming Contest B.SGA President
问题链接:B.SGA President私の解法:试合をする时、自分で大丈夫だと思って、しかしずっとwa、waは4、5回、しかしやはり问题を発见していないで、方法は比较的に愚かですが、しかしどうにか答えを解くことができます(いくつかのデータをテストして问题がありません)...
実は私とあまり差がありません.mapを1つ使って、同じ文字列の個数を統計して、同じアルファベットの冒頭の遍数を1つの配列で統計して、for()は走りながら行けばいいです.
指正を求める
#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;
}
指正を求める