ryopper777
@ryopper777 (Ryosuke Kawata)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

AtCoder Beginners Contest 259 C問題

初めに

AtCoderを初めて、約一ヶ月の駆け出しです。とりあえず茶色diffの問題を解けるようになろうと思って頑張っています。
Qiitaに初めて質問・投稿するので、書き方がおかしいところなどがあるとは思いますが、ご容赦ください。

問題

AtCoder Beginners Contest 259 C問題

回答状況

回答の発想的には模範回答と同じ(ランレングス圧縮)で、自分なりのランレングス圧縮っぽいコードを書いてみました。
自分で書いたコード(下に記載)ではテストケース32個のうち、28ケースがACだったのですが、4ケースがREになりました。(結局原因がわからず時間切れ)

質問

以下の点についてお答えいただきたく思います。

  • どうして4ケースのみコンパイルエラーになったのか?
  • 自分のコードのどこがおかしいのか?
  • その他、プログラミングの作法などで不自然なところ(不自然なところ、こういうもの使うと便利などあればお願いします。)

自分で書いたコード

#include<bits/stdc++.h>
#include<math.h>
using namespace std;
 
int main(){
  string s,t;
  cin >> s >> t;
  vector<int> sn;
  vector<int> tn;
  vector<int> sc;
  vector<int> tc;
  char before = ' ';
  for(int i=0; i<(int)s.size(); i++){
    if(s.at(i) != before){
      sc.push_back(s.at(i));
      sn.push_back(1);
    }
    else sn.at(sn.size() - 1) += 1;
    before = s.at(i);
  }
  before = ' ';
  for(int i=0; i<(int)t.size(); i++){
    if(t.at(i) != before){
      tc.push_back(t.at(i));
      tn.push_back(1);
    }
    else tn.at(tn.size() - 1) += 1;
    before = t.at(i);
  }
  int flg = 0;
  if(sc.size() != tc.size()) flg = 1;
  for(int i=0; i<(int)tn.size(); i++){
    if(sc.at(i) != tc.at(i)) flg = 1;
    if(sn.at(i) > tn.at(i)) flg = 1;
    if(sn.at(i) == 1 && sn.at(i) != tn.at(i)) flg = 1;
  }
  if(flg == 0) cout << "Yes" << endl;
  else cout << "No" << endl;
}

(B問題でmathライブラリを使ったので、C問題では使っていませんがimportしています。)

ご回答よろしくお願いいたします。

0

2Answer

  • どうして4ケースのみコンパイルエラーになったのか?

コンパイルエラー(CE)ではなくランタイムエラー(RE)です。
以下のようにsc.size() < tc.size()となる入力が与えられたのでしょう。

aa
aab
  • 自分のコードのどこがおかしいのか?

上記のような入力が与えられると、最後のfor文の中でscへの範囲外アクセスが発生します。
この入力例だと、tn.size()が2なので、iが1まで増えて、sc.at(i)が範囲外アクセスとなります。

  • その他、プログラミングの作法などで不自然なところ

私なら型は合わせますが、競プロなら結果が正しければ構わないでしょうか。
sc,tcの型はvector<char>for文のインデックスの型はsize_tなど。

0Like

Your answer might help someone💌