#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
//N代表查询的子母数,此题每次最多可以查询30个字母
#define eps 1e-9
#define MAXN 1000010
#define MAX 40
#define N 30
int cnt,n,m,k;
//ans用来求最终结果,命中次数
int ans;
struct Trie{
int count;
Trie *child[N];
}trie[MAXN];
Trie *root;
Trie *newtree()
{
trie[cnt].count=0;
for (int i=0;i<N;i++)
{
trie[cnt].child[i]=NULL;
}
return &trie[cnt++];
}
void insert(char *str)
{
Trie *s=root;//s指向根节点
int len=strlen(str);
for(int i=0;i<len;i++)
{
int num=str[i]-'a';
if(s->child[num]==NULL)
s->child[num]=newtree();
s=s->child[num];
s->count++;
}
}
int search(char *str)
{
Trie *s=root;
int len=strlen(str);
for (int i=0;i<len;i++)
{
int num=str[i]-'a';
if (s->child[num]==NULL)
{
return 0;
}
s=s->child[num];
}
return s->count;
}
int main()
{
int i,j;
char words[MAX];
double num[8];
double sum;
int number;
while(scanf("%d %d",&n,&m)!=EOF)
{
ans=0;
cnt=0;
root=newtree();
for (i=0;i<n;i++)
{
scanf("%s",words);
insert(words);
}
//m次询问
for (i=0;i<m;i++)
{
scanf("%d",&k);
//k代表每次询问查询的字符数目
memset(words,0,sizeof(words));
//进行k次循环
for(j=0;j<k;j++)
{
//sum为了求出每8位数字的总和以求出平均值
sum=0.0;
for (int t=0;t<8;t++)
{
scanf("%lf",&num[t]);
sum+=num[t];
}
sum/=8;
number=0;
for (int t=0;t<8;t++)
{
if(num[t]-sum>eps)
number+=pow(2.0,7-t);
}
char c=number;
words[j]=c;
}
ans+=search(words);
}
printf("%ld\n",ans);
}
system("pause");
return 0;
}
07-24