Algoogle

Algorithm for Programming Contest

AOJ 1326 Stylish

Category: AOJ Tag: parsing

Stylish

問題概要


解法


お手本のインデントをあらかじめ数えておいて
R,C,Sを1~20すべての組み合わせを試して各行のインデントと一致するか調べる.
すべて一致したら、初心者の方のインデントを決定する.
試行を繰り返して違う解が複数出てきたらそこは-1

コード


(1326.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <bits/stdc++.h>
#define repi(i,a,b) for(int i = (a); i < (b); i++)
#define rep(i,a) repi(i,0,a)
#define pb push_back
using namespace std;

int main(){
    int p, q;
    while(cin >> p >> q, p || q){
        vector<string> P, Q;
        vector<int> Pind;
        cin.ignore();
        rep(i,p){
            string str; cin >> str;
            P.pb(str);
            int indent = 0;
            rep(j,str.size()){
                if(str[j] != '.') break;
                indent++;
            }
            Pind.pb(indent);
        }
        rep(i,q){
            string str; cin >> str;
            Q.pb(str);
        }
        vector<int> ans(q,-2);
        repi(R,1,21) repi(C,1,21) repi(S,1,21){
            int r = 0, c = 0, s = 0;
            bool ok = true;
            rep(i,p){
                if(R*r+C*c+S*s != Pind[i]){
                    ok = false;
                    break;
                }
                rep(j,P[i].size()){
                    switch (P[i][j]){
                    case '(': r++; break;
                    case ')': r--; break;
                    case '{': c++; break;
                    case '}': c--; break;
                    case '[': s++; break;
                    case ']': s--; break;
                    }
                }
            }
            if(!ok) continue;
            r = 0; c = 0; s = 0;
            rep(i,q){
                int tmp = R*r+C*c+S*s;
                if(ans[i] == -2) ans[i] = tmp;
                else if(ans[i] != tmp) ans[i] = -1;
                rep(j,Q[i].size()){
                    switch (Q[i][j]){
                    case '(': r++; break;
                    case ')': r--; break;
                    case '{': c++; break;
                    case '}': c--; break;
                    case '[': s++; break;
                    case ']': s--; break;
                    }
                }
            }
        }
        rep(i,q) cout << ans[i] << (i==q-1? '\n': ' ');
    }
    return 0;
}

Comments