浅谈\(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. less开发指南(一)- 小牛试刀

    [一]less简介 LESS(是.less后缀名的文件) 包含一套自定义的语法及一个解析器,我们根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 CSS 文件.LESS 并没有 ...

  2. ngnix配置自解

    全局配置 user [user] [group]; #只有被设置为用户或用户组的成员才有nginx的启动权限.(#user nobody nobody <=> user nobody no ...

  3. NC 工具的使用教程

    NC工具的使用说明...nc使用说明 参数介绍: nc.exe -h即可看到各参数的使用方法. 基本格式:nc [-options] hostname port[s] [ports] ... nc - ...

  4. ansible入门四(Ansible playbook基础组件介绍)

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

  5. iOS自动化探索(八)Mac上的Jenkins安装

    安装Jenkins 首先检查是否有Jenkins依赖的java环境 java -version 出现java version "1.8.xx"说明已经安装了java Jackeys ...

  6. procrdure存储过程

    /* 存储过程 在一些语言中,有一个概念叫”过程“ procedure,和”函数“ function 过程:封装了若干条语句,调用时,这些封装体执行 函数:是一个有返回值的“过程” 过程:没有返回值的 ...

  7. c# 字符串验证(邮箱、电话、数字、ip、身份证等)

    using System; using System.Text.RegularExpressions; namespace HuaTong.General.Utility { /// <summ ...

  8. DOM 踩踩踩

    1.如果是想给一个DOM元素添加一个伪类,可以转换为  为这个元素添加一个类名,这个类名上面绑定一个伪类. 2.append一个元素,删除掉原来的元素再进行添加.

  9. 如何从github下载项目的源代码,包含git客户端,直接下载,vs下载

    有好多小伙伴可能刚刚接触github,还不知道如果和github下载项目,此处写个博客统一的声明.从多种方式下载源代码,加深对git的理解. 首先先解释下git的含义,git是一个源代码的管理工具,通 ...

  10. NSLog 打印出方法函数,行数,内容

    #if DEBUG #define NSLog(FORMAT, ...) fprintf(stderr,"\nfunction:%s line:%d content:%s\n", ...