浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=1590

把秘密信息建一棵\(Trie\),在节点上记录经过这个结点的字符串\(sum\)一共有多少个(也就是以从根到当前结点为前缀的字符串一共有多少个),记录以当前节点为字符串结尾\(bo\)的有多少个(也就是从根开始到当前结点的字符串一共有多少个)。

对于每一个密码,从根开始,把沿途所有的\(bo\)算进答案里(这些秘密信息是这条密码的前缀),最后到达的结点的\(sum\)加进答案里(这些秘密信息的前缀是这条密码),注意最后落脚点的\(bo\)要减去。

时间复杂度:\(O(\sum B_i+\sum C_i)\)

空间复杂度:\(O(\sum B_i+\sum C_i)\)

代码如下:

#include <cstdio>
using namespace std; const int maxn=5e5+5; int num[maxn];
int n,m,cnt,ans; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct Trie {
int tot;
int bo[maxn];
int sum[maxn];
int son[maxn][2]; void ins() {
int pos=1;
for(int i=1;i<=cnt;i++) {
if(son[pos][num[i]])pos=son[pos][num[i]];
else pos=son[pos][num[i]]=++tot;sum[pos]++;
}
bo[pos]++;
} void find() {
int pos=1;
for(int i=1;i<=cnt;i++) {
if(son[pos][num[i]])pos=son[pos][num[i]];
else return;ans+=bo[pos];
}
if(bo[pos])ans-=bo[pos];ans+=sum[pos];
}
}T; int main() {
n=read(),m=read(),T.tot=1;
for(int i=1;i<=n;i++) {
cnt=read();
for(int j=1;j<=cnt;j++)
num[j]=read();
T.ins();
}
for(int i=1;i<=m;i++) {
cnt=read(),ans=0;
for(int j=1;j<=cnt;j++)
num[j]=read();
T.find();printf("%d\n",ans);
}
return 0;
}

BZOJ1590:[Usaco2008 Dec]Secret Message秘密信息的更多相关文章

  1. BZOJ1590 [Usaco2008 Dec]Secret Message 秘密信息

    建立一颗trie树,记录下来每个点以它为结尾的字符串的个数cnt,和它的子树内有多少字符串size 于是查询的时候就只需要把沿途的cnt加起来,再加上最后的size就好了 /************* ...

  2. [BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)

    传送门 看到前缀就要想到字典树! 看到前缀就要想到字典树! 看到前缀就要想到字典树! #include <cstdio> #include <iostream> #define ...

  3. [Usaco2008 Dec]Secret Message 秘密信息

    2794: [Usaco2008 Dec]Secret Message 秘密信息 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3 ...

  4. 1590: [Usaco2008 Dec]Secret Message 秘密信息

    1590: [Usaco2008 Dec]Secret Message 秘密信息 Time Limit: 5 Sec  Memory Limit: 32 MBSubmit: 209  Solved:  ...

  5. bzoj 1590: [Usaco2008 Dec]Secret Message 秘密信息

    1590: [Usaco2008 Dec]Secret Message 秘密信息 Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共 ...

  6. 【Trie】Secret Message 秘密信息

    [题目链接]: https://loj.ac/problem/10054 [题意] 我认为这个题目最难的是题意: 其实分了两种情况: 1.如果当前文本串匹配不完,那么答案的是:匹配过程中遇到的模式串结 ...

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

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

  8. [USACO08DEC] 秘密消息Secret Message

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

  9. 「USACO08DEC」「LuoguP2922」秘密消息Secret Message(AC自动机

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

随机推荐

  1. Roman Numeral Converter

    将给定的数字转换成罗马数字. 所有返回的 罗马数字 都应该是大写形式. 这是一些对你有帮助的资源: Roman Numerals Array.splice() Array.indexOf() Arra ...

  2. echarts在miniUI和ajax下动态渲染数据

    <script src="echarts.js"></script> <script src="jquery-3.3.1.min.js&qu ...

  3. MySQL使用RPM包方式安装

        CentOS7安装MySQL的方法之RPM包方式        

  4. 剑指offer--38.左旋转字符串

    时间限制:1秒 空间限制:32768K 热度指数:173814 本题知识点: 字符串 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果. ...

  5. console 代理

    window.log = function(){ if(!window.console ){ return; } var arr = [].slice.call(arguments); arr.uns ...

  6. 如何修改MyEclipse的默认编码方式

    在创建jsp页面时,默认首行出现“<%@ page language="java" import="java.util.*" pageEncoding=& ...

  7. java项目添加到Tomcat中运行-(项目转换为Dynamic Web Project)

    当在eclipse中建了一个java project项目希望他运行在Tomcat中时: 在项目上右键单击,选择 Properties: 在左侧选择 Project Facets,单击右侧的 ”Conv ...

  8. Faster R-CNN改进篇(二): RFCN ● RON

    @改进1:RFCN 论文:R-FCN: Object Detection via Region-based Fully Convolutional Networks    [点击下载] MXNet代码 ...

  9. RMI垃圾收集简介

    和单机系统类似, 分布式系统也需要自动清除不再有客户端引用的对象(remote object). 远程对象的自动垃圾回收机制, 将程序员从深坑中解放出来, 不再需要人工跟踪client所引用的对象了. ...

  10. 去除inline-block元素间间距的N种方法(转)

    一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子: <input /> <input type="su ...