题目:###


题目链接:[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. C++ 四种强制类型转变与区别之处

    使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast.1.static_cast    用法:static_cast&l ...

  2. spark通信原理

    https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/network https://git ...

  3. CH 5402 选课(分组背包+树形DP)

    CH 5402 选课 \(solution:\) 很有讨论套路的一道题,利用树的结构来表示出不同课程之间的包含关系(这里还要建一个虚点将森林变成一颗打大树).然后用子树这个概念巧妙的消除了因为这些包含 ...

  4. link与import区别

    本质上,这两种方式都是为了加载css文件,但还是存在细微的差别. 差别1:老祖宗的差别,link属于XHTML标签,而@import完全是css提供的一种方式. link标签除了可以加载css外,还可 ...

  5. hihocoder #1068 : RMQ-ST算法 ( RMQ算法 O(nlogn)处理 O(1)查询 *【模板】 1)初始化d数组直接读入+计算k值用数学函数log2()==*节约时间 )

    #1068 : RMQ-ST算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备 ...

  6. 解决virtualbox安装增强工具失败的问题

    virtualbox有个增强工具,安装之后用户体验是非常爽的.但是有些时候在安装增强工具会遇到一些小问题,无非是没有安装gcc,make之类的编译工具或是需要安装kernel*.而我遇到的问题在做了这 ...

  7. LA-4356&&hdu-2469 (极角排序+扫描线)

    题目链接: Fire-Control System Time Limit: 12000/5000 MS (Java/Others)     Memory Limit: 32768/32768 K (J ...

  8. BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数

    BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行 ...

  9. Excel: 应用Match/Vlookup比较Excel两列的不同数据

    假设Excel中有两列,现在要比较两列数据的不同.

  10. 微信小程序在线制作 自己制作微信小程序

    小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最近老是听这类问题,耳朵都长茧子了. 百牛信息技术bainiu.ltd整理发布于博客园 接下来作为一个技术人员的角度就为大家分析一下 ...