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