【競プロ精進ログ】ABC164-C

zuka

ABCをコツコツ解いていきます。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。

これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC164-C「gacha」です。

ポイント

配列の重複要素を削除する問題です。配列は配列でも,int A[N]のようなC言語の配列は基本的には固定長を扱うことが多いため,重複削除には不向きです。一方,vector型であれば可変長のデータをうまく扱うことができるため,今回はvector型のコンテナ(配列のようなもの)を利用したいと思います。

重複要素の削除方法に関しては,以下の記事をご覧ください。重複削除では隣り合う要素が同じときに重複とみなされるため,対象とする配列はあらかじめソートされている必要がある点に注意してください。

おさえるべき内容

 vector型の重複要素の削除

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;
typedef long long ll;

vector<string> S;

int main(){
  int N;
  cin >> N;
  // 格納する文字列
  string s;
  rep(i, N){
    cin >> s;
    // vetorに格納していく
    S.push_back(s);
  }

  // ソートされていないと隣り合う重複要素しかヒットしないためうまく削除されない
  sort(S.begin(), S.end());

  // 隣り合う重複要素をマージしてゴミを削除する
  S.erase(unique(S.begin(), S.end()), S.end());

  // 削除後のvectorの長さを出力
  cout << S.size() << endl;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる