AOJ 1111 Cyber Guardian

問題

Cyber Guardian

パケットフィルタリングをする問題。n個のruleとm個のパケットが与えられる。ruleの優先順位は後に入力された方が高い。すべてのruleに当てはまらなければ許可されない。通信が許可されるパケットの数とパケットの内容を表示せよ。

解法

やるだけ。

心臓に悪いコード

int judge(string src, string dst){
  for(int i = n-1; i >= 0; i--){
    int p;
    for(p = 0; p < 8; p++){
      if(rule[i].S.F[p] != '?' && src[p] != rule[i].S.F[p]) break;
      if(rule[i].S.S[p] != '?' && dst[p] != rule[i].S.S[p]) break;
    }
    if(p == 8) return rule[i].F;
  }
  return 0;
}

int main(){
  while(scanf("%d%d", &n, &m) && n+m){
    rule.clear();
    string r, src, dst, mes;
    rep(i, n){
      cin >> r >> src >> dst;
      rule.PB(MP((r[0]=='p')?1:0, MP(src, dst)));
    }

    vector<pair<string, pair<string, string> > >res;
    rep(i, m){
      cin >> src >> dst >> mes;
      if(judge(src, dst)) res.PB(MP(src, MP(dst, mes)));
    }

    printf("%d\n", (int)res.size());
    rep(i, res.size()) cout << res[i].F << " " << res[i].S.F << " " << res[i].S.S << endl;
  }
  return 0;
}