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