草体にぼ日記

だらだらと

ABC073C Write and Erase

ABC073C Write and Erase

提出AC1

int main()
{
    cout <<setprecision(10);
    ll n; cin >> n;
    map<ll,bool> A;
    rep(i,n){
        ll a;
        cin >> a;
        if(!A.count(a)||A[a] == false){//存在していないならばboolをtrueにする
            A[a] = true;
        }else{
            //すでに入っているんだったらfalse にする
            A[a] = false;
        }
    }
    ll ans = 0 ;
    for(auto x : A){//true を数える
        if(x.second){
            ans ++ ;
        }
    }
    cout << ans << endl;
 
 
}

提出AC2

int main()
{
    cout <<setprecision(10);
    int n ; cin >> n;
    map<ll,ll> A;
    rep(i,n){
        int a ; cin >> a;
        A[a] ++;
    }
    ll ans = 0;
    for(auto x : A){
        if(x.second %2 == 1){
            ans ++ ;
        }
    }
    cout << ans << endl;
}

提出AC3

int main()
{
    cout <<setprecision(10);
    ll n ; cin >> n;
    vector<int> A(n);
    rep(i,n) cin >> A[i];
    SORT(A);
 
    ll ans = 0 ;
    ll bef = -1 ;
    rep(i,n){   
        if(bef != A[i] ){
            ans ++;
            bef = A[i];
        }else{
            ans --;
            bef = -1;
        }
    }
    cout << ans << endl;
}

解法

提出1も提出2もやっていることはほとんど同じ。

マップを用いて実装した。

提出1

一回目に出てくるときは紙に数字を書くのでキーをその数字としてtrueを書き込む

二回目以降はtrueとfalseを入れ替える

提出2

出てきた回数をカウントして、それが奇数ならそのキーは紙に書かれている。

その数(奇数回出てきたものの数)を数える

提出3

とても分かりずらいコードだと思う。

とりあえず読んでみて。

分からなくてもいいです。