Problem p03408 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N;       // 青いカードの枚数
  int M;       // 赤いカードの枚数
  string Word; // 文字列

  cin >> N;                       // 青いカード枚数を読む
  vector<string> BlueWord(N, ""); // 青いカードの文字セット
  vector<int> BlueCtr(N, 0);      // 青i番目の文字セットの枚数
  int Bctr = 0;                   // 文字列のセット数
  bool NewWord;                   // 読み込んだカードが新規ならtrue
  int MaxNo = 0;                  // 文字列の最大個数

  for (int i = 0; i < N; i++) {
    NewWord = true;
    cin >> Word; // 青いカードの読み込み

    for (int j = 0; j < Bctr; j++) {
      if (BlueWord.at(j) == Word) { // 既にある
        BlueCtr.at(j) += 1;
        NewWord = false;
        break;
      }
    }
    if (NewWord == true) {
      BlueWord.at(Bctr) = Word;
      BlueCtr.at(Bctr) = 1;
      Bctr += 1;
    }
  }

  //  for (int i=0; i<Bctr; i++){
  //    cout << BlueWord.at(i) << "  " <<BlueCtr.at(i) << endl;
  //  }

  cin >> M;                      // 赤いカードを読む
  vector<string> RedWord(M, ""); // 赤いカードの文字セット
  vector<int> RedCtr(N, 0);      // 赤i番目の文字セットの枚数
  int Rctr = 0;                  // 文字列のセット数
  for (int i = 0; i < M; i++) {
    NewWord = true;
    cin >> Word; // 赤いカードの読み込み

    for (int j = 0; j < Rctr; j++) {
      if (RedWord.at(j) == Word) { // 既にある
        RedCtr.at(j) += 1;
        NewWord = false;
        break;
      }
    }
    if (NewWord == true) {
      RedWord.at(Rctr) = Word;
      RedCtr.at(Rctr) = 1;
      Rctr += 1;
    }
  }

  //  for (int i=0; i<Rctr; i++){
  //    cout << RedWord.at(i) << "  " <<RedCtr.at(i) << endl;
  //  }

  for (int i = 0; i < Bctr; i++) {
    for (int j = 0; j < Rctr; j++) {
      if (BlueWord.at(i) == RedWord.at(j)) {
        BlueCtr.at(i) -= RedCtr.at(j);
        break;
      }
    }
    if (BlueCtr.at(i) > MaxNo) {
      MaxNo = BlueCtr.at(i);
    }
  }

  cout << MaxNo;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N;       // 青いカードの枚数
  int M;       // 赤いカードの枚数
  string Word; // 文字列

  cin >> N;                       // 青いカード枚数を読む
  vector<string> BlueWord(N, ""); // 青いカードの文字セット
  vector<int> BlueCtr(N, 0);      // 青i番目の文字セットの枚数
  int Bctr = 0;                   // 文字列のセット数
  bool NewWord;                   // 読み込んだカードが新規ならtrue
  int MaxNo = 0;                  // 文字列の最大個数

  for (int i = 0; i < N; i++) {
    NewWord = true;
    cin >> Word; // 青いカードの読み込み

    for (int j = 0; j < Bctr; j++) {
      if (BlueWord.at(j) == Word) { // 既にある
        BlueCtr.at(j) += 1;
        NewWord = false;
        break;
      }
    }
    if (NewWord == true) {
      BlueWord.at(Bctr) = Word;
      BlueCtr.at(Bctr) = 1;
      Bctr += 1;
    }
  }

  //  for (int i=0; i<Bctr; i++){
  //    cout << BlueWord.at(i) << "  " <<BlueCtr.at(i) << endl;
  //  }

  cin >> M;                      // 赤いカードを読む
  vector<string> RedWord(M, ""); // 赤いカードの文字セット
  vector<int> RedCtr(M, 0);      // 赤i番目の文字セットの枚数
  int Rctr = 0;                  // 文字列のセット数
  for (int i = 0; i < M; i++) {
    NewWord = true;
    cin >> Word; // 赤いカードの読み込み

    for (int j = 0; j < Rctr; j++) {
      if (RedWord.at(j) == Word) { // 既にある
        RedCtr.at(j) += 1;
        NewWord = false;
        break;
      }
    }
    if (NewWord == true) {
      RedWord.at(Rctr) = Word;
      RedCtr.at(Rctr) = 1;
      Rctr += 1;
    }
  }

  //  for (int i=0; i<Rctr; i++){
  //    cout << RedWord.at(i) << "  " <<RedCtr.at(i) << endl;
  //  }

  for (int i = 0; i < Bctr; i++) {
    for (int j = 0; j < Rctr; j++) {
      if (BlueWord.at(i) == RedWord.at(j)) {
        BlueCtr.at(i) -= RedCtr.at(j);
        break;
      }
    }
    if (BlueCtr.at(i) > MaxNo) {
      MaxNo = BlueCtr.at(i);
    }
  }

  cout << MaxNo;
}