题目:###


题目链接:[USACO08DEC]秘密消息Secret Message

题意:##

给定n条01信息和m条01密码,对于每一条密码A,求所有信息中包含它的信息条数和被它包含的信息条数的和。

分析:##

建立一棵trie树,类似于存储26个字母一样存储0和1(每个节点只有两个儿子),然后设包含节点p的信息条数有size[p]条,在节点p结束的信息条数有end[p]条,节点的两个儿子的编号为num[p][0]和num[p][1],然后存储信息。

我们容易知道size[p]存储的实际上是包含了“从根节点走到p节点所代表的这条字符串”的所有字符串的总数(包括这条字符串自己)

对于每一条读入的密码,我们把它存储在一个临时数组里,然后在这棵trie树上往下找,记录一个ans,走过每一个节点的时候ans+=end[p]。

走的时候会有两种情况:

  • 这条路比这个密码短(即所有符合条件的信息都是这条密码的子集),那么走到尽头就可以了
  • 这条路比这个密码长,那么走到这条密码的尽头(这条密码的最后一个字符对应的节点)的时候ans+=size[p](见上面的解释),其余时间ans+=end[p]就可以了

代码不长,我用结构体写的trie树(和上面分析的变量名字是一样的),然后不知道哪里的玄学优化(register?)起了作用好像跑得还有点快(…)

里面的注释自认为比较齐全了


代码:###

#include<bits/stdc++.h>
using namespace std;
inline int read(){
int cnt=0,f=1;char c;
c=getchar();
while(!isdigit(c)){
if(c=='-')f=-f;
c=getchar();
}
while(isdigit(c)){
cnt=cnt*10+c-'0';
c=getchar();
}
return cnt*f;
}
int n,m,len,tot;//tot:记录节点编号
struct node{
int end;//记录有多少条信息在这个节点完结
int size;//记录有多少条信息过这个节点
int num[2];//记录左右儿子编号
}trie[500005];
int a[50005];//临时数组,用于存放每次添加的信息或密码
inline void insert(int k){
int p=0;
for(register int i=1;i<=k;p=trie[p].num[a[i]],i++){
if(!trie[p].num[a[i]])trie[p].num[a[i]]=++tot;
trie[p].size++;
}
trie[p].size++;
trie[p].end++;
}
inline int ask(int k){
int p=0;
int ans=0;
for(register int i=1;i<=k;p=trie[p].num[a[i]],i++){
int to=trie[p].num[a[i]];
if(!to)break;//如果这条路上没有更长的信息(走不动了)就不搜了
if(i==k)ans+=trie[to].size;//如果这条密码走到头了就把包含它的串的个数都加上(这里包含了和它一样的串)
else
ans+=trie[to].end;//如果没有走到头就把到这个节点完结的串的个数加上
}
return ans;
}
int main(){
m=read();n=read();
for(register int i=1;i<=m;i++){
len=read();
for(register int j=1;j<=len;j++)a[j]=read();
insert(len);
}
for(register int i=1;i<=n;i++){
len=read();
for(register int j=1;j<=len;j++)a[j]=read();
printf("%d\n",ask(len));
}
return 0;
}

洛谷p2922[USACO08DEC]秘密消息Secret Message的更多相关文章

  1. 洛谷 P2922 [USACO08DEC]秘密消息Secret Message

    题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...

  2. 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]

    洛谷传送门,BZOJ传送门 秘密消息Secret Message Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共有M(1≤M≤5 ...

  3. 【题解】P2922 [USACO08DEC]秘密消息Secret Message

    \(\text{Tags}\) 字典树,统计 题意: 给出两组\(\text{0/1}\)串\(\text{A,B}\),求解\(\text{A}\)中某串是\(\text{B}\)中某串的前缀,和\ ...

  4. Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树

    本来想找\(01Trie\)的结果找到了一堆字典树水题...算了算了当水个提交量好了. 直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点 ...

  5. P2922 [USACO08DEC]秘密消息Secret Message

    传送门 思路: 还是比较水的(不看题解不看书),用 vis 存字典树上的每个点是多少个单词的前缀,bo 来存每个点是多少个单词的结尾(坑点:会有很多相同的单词,不能只有 bool 来存).统计时:① ...

  6. 洛谷 2922 BZOJ 1590 [USACO08DEC]秘密消息Secret Message

    [题意概述] 给出n个01串组成的字典和m个询问,每次询问某个01串和多少个字典中的串有相同的前缀.(前缀长度是两串中较小的部分) [题解] 直接上Trie树即可.树上每个节点记录两个信息:这个节点有 ...

  7. [USACO08DEC] 秘密消息Secret Message

    题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...

  8. [USACO08DEC] 秘密消息Secret Message (Trie树)

    题目链接 Solution Trie 树水题. 直接将前面所有字符串压入Trie 中. 在查询统计路上所有有单词的地方和最后一个地方以下的单词数即可. Code #include<bits/st ...

  9. Luogu2922 [USACO08DEC]秘密消息Secret Message (Trie树)

    统计以节点\(i\)结尾的数量与经过的数量 #include <iostream> #include <cstdio> #include <cstring> #in ...

随机推荐

  1. [Android]Android5.0实现静默接听电话功能

    原因: android曾经能够通过AIDL进行静默接听.可是5.0以后就被谷歌给屏蔽了.这时候我们仅仅能通过其它方式实现了. 解决方式: try { Runtime.getRuntime().exec ...

  2. Android GUI系统学习1:Gralloc

    Gralloc模块是从Android Eclair(android 2.1)開始增加的一个HAL模块,Gralloc的含义为是Graphics Alloc(图形分配).他对上为libui提供服务,为其 ...

  3. python day- 16 面向对象

    1.类的相关知识 类:是指具有相同属性和技能的一类事物. 比如:人类 ,植物类,动物类,狗类. 对象:是类中的某一个实例,是类的具体表现. 比如:具体到某个人,某一个植物,某一条狗. class 是p ...

  4. 对云资源服务商资源读写的架构思考:前端代码走token

    第一.统一了访问端接口.提高前端开发速度:第二统一了阿里各个产品的 数据读写模式: 第三,我们的服务器产生token时对读写规则做限制,特定的token由特定的规则产生,而不是让前端代代码去管控限制 ...

  5. 使用Microsoft Office 2007将文档转换为PDF

    点击帮助 输入关键词PDF后搜索 点击进入Save or convert to PDF or XPS 点击进入2007 Microsoft Office Add-in: Microsoft Save ...

  6. HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. spring核心框架体系结构(各个jar包作用)

    转自:https://blog.csdn.net/sunchen2012/article/details/53939253 弄懂spring就是弄懂spring各个jar包的作用 spring的jar ...

  8. 树状数组(二叉索引树 BIT Fenwick树) *【一维基础模板】(查询区间和+修改更新)

    刘汝佳:<训练指南>Page(194) #include <stdio.h> #include <string.h> #include <stdlib.h&g ...

  9. Simple JavaScript Inheritance

    1. [代码]Simple JavaScript Inheritance     (function(){  var initializing = false, fnTest = /xyz/.test ...

  10. Hadoop的jobhistoryserver配置

    配置mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</na ...