P2922 [USACO08DEC]Secret Message G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

字典树。

#include<bits/stdc++.h>
using namespace std;
#define N 500005
int m, n, a[N], lenth;
int ch[N][2], e[N], sum[N], tot;
void insert(int *s, int len)
{
	int u = 0;
	for(int i = 1; i <= len; i++)
	{
		if(!ch[u][s[i]])
		{
			ch[u][s[i]] = ++tot;
		}
		u = ch[u][s[i]];
		sum[u]++;
	}
	e[u]++;
	return;
}
int query(int *s, int len)
{
	int u = 0, ret = 0;
	for(int i = 1; i <= len; i++)
	{
		if(!ch[u][s[i]])
		{
			return ret;
		}
		u = ch[u][s[i]];
		ret += e[u];
	}
	return ret - e[u] + sum[u];
}
int main()
{
	scanf("%d%d", &m, &n);
	for(int i = 1; i <= m; i++)
	{
		scanf("%d", &lenth);
		for(int j = 1; j <= lenth; j++)
		{
			scanf("%d", &a[j]);
		}
		insert(a, lenth);
	}
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &lenth);
		for(int j = 1; j <= lenth; j++)
		{
			scanf("%d", &a[j]);
		}
		printf("%d\n", query(a, lenth));
	}
	return 0;
}