RT 23分 trie树 调了非常多天还是23分
评测结果
代码:
#include<bits/stdc++.h>
#define N 50005
#define int long long
using namespace std;
inline int read()
{
int x=0; char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x;
}
int m,n,cnt,maxd;
int a[N][2],pass[N],ed[N];
int f[N/5];
inline void ins(int l)
{
int p=0;
for(int i=1;i<=l;++i)
{
int x=f[i];
if(!a[p][x]){
a[p][x]=++cnt;
p=cnt;
}
else p=a[p][x];
pass[p]++;
}
ed[p]++;
}
inline int ser(int l)
{
int p=0,ans=0;
int i=1;
for(;i<=l;++i)
{
bool x=f[i];
if(!a[p][x]) return ans;
p=a[p][x];
ans+=ed[p];
}
return ans+pass[p]-ed[p];
}
int main()
{
m=read(),n=read();
while(m--)
{
int x=read();
for(int i=1;i<=x;++i) f[i]=read();
ins(x);
}
while(n--)
{
int x=read();
for(int i=1;i<=x;++i) f[i]=read();
printf("%d\n",ser(x));
}
return 0;
}