题目描述

Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret binary messages to each other.

Ever the clever counterspy, Farmer John has intercepted the first b_i (1 <= b_i <= 10,000) bits of each of M (1 <= M <= 50,000) of these secret binary messages.

He has compiled a list of N (1 <= N <= 50,000) partial codewords that he thinks the cows are using. Sadly, he only knows the first c_j (1 <= c_j <= 10,000) bits of codeword j.

For each codeword j, he wants to know how many of the intercepted messages match that codeword (i.e., for codeword j, how many times does a message and the codeword have the same initial bits). Your job is to compute this number.

The total number of bits in the input (i.e., the sum of the b_i and the c_j) will not exceed 500,000.

Memory Limit: 32MB

POINTS: 270

贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.

信息是二进制的,共有M(1≤M≤50000)条.反间谍能力很强的约翰已经部分拦截了这些信息,知道了第i条二进制信息的前bi(l《bi≤10000)位.他同时知道,奶牛使用N(1≤N≤50000)条密码.但是,他仅仅了解第J条密码的前cj(1≤cj≤10000)位.

对于每条密码J,他想知道有多少截得的信息能够和它匹配.也就是说,有多少信息和这条密码有着相同的前缀.当然,这个前缀长度必须等于密码和那条信息长度的较小者.

在输入文件中,位的总数(即∑Bi+∑Ci)不会超过500000.

输入输出格式

输入格式:

* Line 1: Two integers: M and N

* Lines 2..M+1: Line i+1 describes intercepted code i with an integer b_i followed by b_i space-separated 0's and 1's

* Lines M+2..M+N+1: Line M+j+1 describes codeword j with an integer c_j followed by c_j space-separated 0's and 1's

输出格式:

* Lines 1..M: Line j: The number of messages that the jth codeword could match.

输入输出样例

输入样例#1:

4 5
3 0 1 0
1 1
3 1 0 0
3 1 1 0
1 0
1 1
2 0 1
5 0 1 0 0 1
2 1 1

输出样例#1:

1
3
1
1
2 

题解

  • 显然是一道字符统计图
  • 依然常规trie
  • 在插入字串时,统计经过该点的个数(cnt)和一样的字串个数(sum)
  • 那么在查找字串,题目其实就是要求"一个包含另一个"
  • 搜索中,如果覆盖了字串(q[p]==true),那么就将sum[p]相加
  • 那么搜完了,就找比他长的字串,就是经过该点的个数cnt
  • 然后我们发现一个问题,就是与被搜索相同的字串在cnt和sum里都统计过了
  • 那么不就多出来一个sum了吗?
  • 减去就好了

代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 int n,m,trie[500010][2],sum[500010],num[500010],cnt[500010],tot,k;
 6 bool q[500010];
 7 void insert(int k)
 8 {
 9     int p=0;
10     for (int i=1;i<=k;i++)
11     {
12         if (trie[p][num[i]]==0) trie[p][num[i]]=++tot;
13         p=trie[p][num[i]];
14         cnt[p]++;
15     }
16     q[p]=1; sum[p]++;
17 }
18 int search(int k)
19 {
20     int p=0,ans=0;
21     for (int i=1;i<=k;i++)
22     {
23         if (!trie[p][num[i]]) return ans;
24         p=trie[p][num[i]];
25         if (q[p]) ans+=sum[p];
26     }
27     ans+=cnt[p];
28     if (q[p]) ans-=sum[p];
29     return ans;
30 }
31 int main()
32 {
33     scanf("%d%d",&m,&n);
34     for (int i=1;i<=m;i++)
35     {
36         scanf("%d",&k);
37         for (int j=1;j<=k;j++) scanf("%d",&num[j]);
38         insert(k);
39     }
40     for (int i=1;i<=n;i++)
41     {
42         scanf("%d",&k);
43         for (int j=1;j<=k;j++) scanf("%d",&num[j]);
44         printf("%d\n",search(k));
45     }
46     return 0;
47 }

转载于:https://www.cnblogs.com/Comfortable/p/8796693.html

[Trie] Luogu P2992 [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 sec ...

  2. P2922-[USACO08DEC]秘密消息Secret Message【Trie,字符串】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2922 题目大意 给n个01串,用m个01串匹配,如果n是m的前缀或 ...

  3. 洛谷 P3102 [USACO14FEB]秘密代码Secret Code

    P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...

  4. WCF后续之旅(16): 消息是如何分发到Endpoint的--消息筛选(Message Filter)

    在介绍终结点的ListenUriMode时,我们提到了两个特殊的对象ChannelDispatcher和ChannelListener.这两个对象在整个WCF的消息分发系统中具有重要的地位,在这节里, ...

  5. Android安全加密:消息摘要Message Digest

    Android安全加密专题文章索引 Android安全加密:对称加密 Android安全加密:非对称加密 Android安全加密:消息摘要Message Digest Android安全加密:数字签名 ...

  6. RTMPdump(libRTMP) 源代码分析 9: 接收消息(Message)(接收视音频数据)

    2019独角兽企业重金招聘Python工程师标准>>> 注:此前写了一些列的分析RTMPdump(libRTMP)源代码的文章,在此列一个列表: RTMPdump 源代码分析 1: ...

  7. Android的消息机制: Message/MessageQueue/Handler/Looper

    概览 * Message:消息.消息里面可包含简单数据.Object和Bundle,还可以包含一个Runnable(实际上可看做回调). * MessageQueue:消息队列,供Looper线程消费 ...

  8. pythonmessage用法_django 消息框架 message使用详解

    前言 在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证 ...

  9. 【Android开发】消息处理类(Handler)与消息类(Message)介绍

    一.消息处理类(Handler)简介 消息处理类Handler允许发送和处理Message或Runnable对象到其所在线程的MessageQueue中.Handler主要有一下两个作用: 1.将Me ...

最新文章

  1. Tab Bar Animation
  2. R语言ggplot2可视化:使用R原生plot函数为指定曲线下面的区域着色、ggplot2可视化在曲线的特定下方添加分割线、ggplot2为指定曲线下面的区域着色
  3. 打造交叉复合型数据人才的高地:清华大学大数据能力提升项目宣讲会成功举行!...
  4. 建设有竞争力的APP开发团队
  5. python嵌套循环跳出_如何跳出嵌套的while循环
  6. 怎么将多个html组合_技巧分享之在HTML元素中添加逼真阴影的教程
  7. 并发执行变成串行_网易Java研发面试官眼中的Java并发——安全性、活跃性、性能...
  8. 【音视频安卓开发 (零)】用 Android NDK 编译 FFmpeg 与 X264
  9. mysql不能做端点测试吗_端点测试的分步介绍
  10. jQuery实现轮播图--入门
  11. 安装VS2008关于解决磁盘已满问题方案.
  12. 强连通图------(1)通过两次DFS或BFS判断是不是强连通图
  13. 懒人分析jQuery源码
  14. 在大米云主机中采用CentOS 6.5 部署Redmine 3.3
  15. Excel 筛选后排序 踩雷笔记
  16. The DELETE statement conflicted with the REFERENCE constraint
  17. 聊聊Redis的各种集群方案、及优缺点对比
  18. 什么是苹果cms?苹果cms如何安装及使用?
  19. 什么是BQB认证?BQB认证蓝牙模块
  20. AutoCAD Civil 3D里材质资源管理器手动重安装

热门文章

  1. 泛型委托Action与ActionT
  2. 运行pip报错:Fatal error in launcher: Unable to create process using '’路径’'
  3. Linux下快速迁移海量文件的操作记录
  4. bzoj2753: [SCOI2012]滑雪与时间胶囊
  5. 解决Sqlite中的中文路径问题
  6. csv数据去重 python_python批量查询、汉字去重处理CSV文件
  7. nginx 获取header 请求参数_Nginx设置Header头信息
  8. Fluid 0.6 版本发布:数据感知的Pod调度与数据集自动弹性扩缩容
  9. Flink 和 Iceberg 如何解决数据入湖面临的挑战
  10. 程序员的未来真的一片阴霾吗,大厂女程序员从未摆脱焦虑