備忘録

まとめておきたいことのメモ 主にプロコンのこと

AOJ-ICPC 2440

今日はこの問題。

Kagisys | Aizu Online Judge

扉を開け閉めためのパスワードがいくつかあります。もし入力された文字列がそのうちの一つと一致していれば扉の開閉を行い、そうでない場合は「Unknown ○○(入力された文字列)」と表示されます。

答えはこちら。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string> 
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
  
using namespace std;
 
int main()
{
    int n, m;
    string pass[256];
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> pass[i];
    }
    cin >> m;
    string input;
    bool isopen = false;
    for(int i = 0; i < m; i++){
        cin >> input;
        bool isfound = false;
        for(int j = 0; j < n; j++){
            if(pass[j] == input){
                isfound = true;
                break;
            }
        }
        if(isfound){
            if(!isopen) cout << "Opened by " << input << endl;
            else cout << "Closed by " << input << endl;
            isopen = !isopen;
        } else cout << "Unknown " << input << endl;
    }
    return 0;
}

まずパスワードを配列passに全て保存します。初期状態では扉は閉じているので、isopenは偽にしておきます。
それから入力された文字列をinputに一時保存。passの0番目から一致するものがあるか確認します。見つかった場合はisfoundを真に変更してそれ以降のpassは確認しなくていいのでそこで終わり。isfoundの初期値は偽なので、passの最後まで探しても見つからなかったときは偽になっています。
この後、isfoundが真であるとき、isopenが真であればclosed~と表示し、偽であればopened~と表示します。isfoundが偽であるときはUnknown~を表示します。

C++はstring型の配列が作れるのでこういう問題を解くのがとても楽ですね。文字列の比較も「==」でできるのがありがたい。