AOJ 1601: Short Phrase

問題

Short Phrase | Aizu Online Judge

単語の列から57577になっている部分列を探し、最初の部分列の最初の単語番号を出力せよ

方針

57577のどこをチェックしているかをstageで管理して最終ステージまで言ったらクリアみたいな感じ

コード

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

int main(void){
    int n;
    int w[41];
    string s;
    while(cin >> n && n) {
        rep(j, n) {
            cin >> s;
            w[j] = s.size();
        }
        bool clear;
        int i;
        for(i=0; i<n; ++i) {
            int j = i;
            int stage = 0;
            clear = false;
            int tmp = 0;
            while(j < n) {
                tmp += w[j] ;
                if(stage == 0) {
                   if(tmp == 5) stage++, tmp = 0;
                   if(tmp > 5) break;
                }
                if(stage == 1) {
                   if(tmp == 7) stage++, tmp = 0;
                   if(tmp > 7) break;
                }
                if(stage == 2) {
                   if(tmp == 5) stage++, tmp = 0;
                   if(tmp > 5) break;
                }
                if(stage == 3) {
                   if(tmp == 7) stage++, tmp = 0;
                   if(tmp > 7) break;
                }
                if(stage == 4) {
                   if(tmp == 7) stage++, clear = true;
                   if(tmp > 7) break;
                }
                j++;
            }
            if(clear) {
                cout << i+1 << endl;
                break;
            }
        }
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1893867

反省

  • 自分が出た予選で唯一解いた問題。さすがに一発ACした
  • stageの管理はループで書くのがきれい(だけど頭使いたくなかった)