在洛谷以外的地方开了一个博客,以后活动大多就在这里进行了,洛谷可能用来写游记之类的玩意。
P2922 [USACO08DEC]Secret Message G 题目传送门在此
一道字典树的入门级题目但是还是蓝题,考察的都是基本的操作,不需要多谈。
那为什么标题还要叫作解题报告
#include<cstring>
#include<cstdio>
#define maxn 500050
#define maxc 10005
int m,n,cnt=1,trie[maxn][2],vis[maxn],sum[maxn];
bool s[maxc];//字符串都是01串,所以用bool变量节省空间
inline int read()
{
char ch=getchar();
int s=0;
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
{
s=s*10+ch-'0';
ch=getchar();
}
return s;
}
inline void insert(bool *s,int len)//基本建树过程
{
int u=1;
for(register int i=1;i<=len;i++)
{
bool c=s[i];
if(trie[u][c]==-1)trie[u][c]=++cnt;
u=trie[u][c];
sum[u]++;
}
vis[u]++;
}
inline int search(bool *s,int len)
{
int u=1,ans=0;
for(register int i=1;i<=len;i++)
{
bool c=s[i];
if(trie[u][c]==-1)return ans;
u=trie[u][c];
ans+=vis[u];//存下符合要求的字符串个数
}
return ans-vis[u]+sum[u];
}
int main()
{
memset(trie,-1,sizeof(trie));//考虑到要存储字符串个数,把字典树初始化为-1
m=read(),n=read();
for(register int i=1;i<=m;i++)
{
int len=read();
for(register int j=1;j<=len;j++)
s[j]=read();
insert(s,len);
}
for(register int i=1;i<=n;i++)
{
int len=read();
for(register int j=1;j<=len;j++)
s[j]=read();
printf("%d\n",search(s,len));
}
return 0;
}