这是一道trie树题目,题意是给了个字典,然后再给你单词,看与字典里多少词匹配。这里的匹配意思是:较短的那个词是较长那个词的前缀。这里有个trick就是,同样的单词可能出现多次。(我在这里wa了几回)
#include <iostream>
#define N 224288
using namespace std;
struct data
{
int r,l,f,tot;
}tree[N];
int ans,first;
int main()
{
int n,m,i,flag,*root,j,k,a;
while (scanf("%d %d",&n,&m)==2)
{
first=2;
memset(tree,0,sizeof(tree));
for (i=0;i<n ;i++)
{
scanf("%d",&k);
flag=0;
root=&flag;
*root=1;
for (j=0;j<k;j++)
{
scanf("%d",&a);
if (a) root=&tree[*root].r;
else root=&tree[*root].l;
if(!*root)*root=first++;
}
tree[*root].f++;
}
for (i=first-1;i>1;i--)
{
tree[i].tot=tree[tree[i].r].tot+tree[tree[i].l].tot+tree[i].f;
}
for (i=0;i<m ;i++)
{
scanf("%d",&k);
ans=0;
root=&flag;
*root=1;
for (j=0;j<k;j++)
{
scanf("%d",&a);
if(a)root=&tree[*root].r;
else root=&tree[*root].l;
ans+=tree[*root].f;
if(!*root)
for(;j<k-1;j++)
scanf("%d",&a);
}
ans+=tree[*root].tot-tree[*root].f;
printf("%d\n",ans);
}
}
return 0;
}