Problem 1111 : Cyber Guardian
問題概要
パケットのフィルタリングのシミュレートをする。
フィルタリングのルールは
(permit|deny) (送信元のパターン) (送信先のパターン)で表される。
送信元のパターンの各文字は0-9の数字または'?'である。
数字はその文字自身にのみマッチし、'?'は任意の数字にマッチする。
フィルタリングのルールが矛盾する場合一番最後に定義されたものが優先される。
パケットは以下のように表される。
(送信元のアドレス) (送信先のアドレス) (テキスト)
このとき、フィルタリングがされないパケットを全て出力せよ。
解法
定義にしたがってフィルタリングする。
フィルタリングのルールは線形探索で十分間に合う。
ソースコード
int n,m,np; char rule[1024][3][10]; char pa[1024][3][51],in[3][51]; int main() { while(scanf("%d%d",&n,&m),n||m) { rep(i,n)rep(j,3)scanf("%s",rule[i][j]); np=0; rep(i,m) { rep(j,3)scanf("%s",in[j]); bool ok=0; rep(j,n) { rep(k,2)rep(l,8)if(rule[j][k+1][l]!='?'&&rule[j][k+1][l]!=in[k][l])goto NEXT; if(rule[j][0][0]=='p')ok=1; else ok=0; NEXT:; } if(ok) { rep(j,3)strcpy(pa[np][j],in[j]); np++; } } printf("%d\n",np); rep(i,np)rep(j,3)printf("%s%c",pa[i][j],j==2?'\n':' '); } return 0; }