AOJ 1111 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; }