#include<stdio.h> #include<stdlib.h> struct node { int data; node *next; }; struct node2 { int need; int key[5]; node2 *next; }; void f(int t,int*sum,node *M,node2 *N,int k) { int c; while(M[t].next!=NULL) { c=M[t].next->data; M[t].next=M[t].next->next; N[c].need++; if(N[c].need==k) { *sum=*sum+1; for(int i=0; i<k; i++) f(N[c].key[i],sum,M,N,k); } } } int main() { int n,m,k,t,sum,i,j,c; scanf("%d%d%d%d",&n,&m,&k,&t); int T[t]; node M[m]; node2 N[n]; node *ptr=NULL; sum=0; for(i=0; i<t;i++) scanf("%d",&T[i]); for(i=0; i<m;i++) M[i].next=NULL; for(i=0; i<n;i++) { N[i].need=0; for(j=0; j<k;j++) { scanf("%d",&c); node *newnode=(node*)malloc(sizeof(node)); newnode->next=NULL; newnode->data=i; ptr=&M[c]; while(ptr->next!=NULL) ptr=ptr->next; ptr->next=newnode; } } for(i=0; i<n;i++) for(j=0; j<k;j++) scanf("%d",&N[i].key[j]); for(i=0; i<t;i++) f(T[i],&sum,&M[0],&N[0],k); printf("%d",sum); }