BZOJ1590:[Usaco2008 Dec]Secret Message秘密信息
浅谈\(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秘密信息的更多相关文章
- BZOJ1590 [Usaco2008 Dec]Secret Message 秘密信息
建立一颗trie树,记录下来每个点以它为结尾的字符串的个数cnt,和它的子树内有多少字符串size 于是查询的时候就只需要把沿途的cnt加起来,再加上最后的size就好了 /************* ...
- [BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)
传送门 看到前缀就要想到字典树! 看到前缀就要想到字典树! 看到前缀就要想到字典树! #include <cstdio> #include <iostream> #define ...
- [Usaco2008 Dec]Secret Message 秘密信息
2794: [Usaco2008 Dec]Secret Message 秘密信息 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 7 Solved: 3 ...
- 1590: [Usaco2008 Dec]Secret Message 秘密信息
1590: [Usaco2008 Dec]Secret Message 秘密信息 Time Limit: 5 Sec Memory Limit: 32 MBSubmit: 209 Solved: ...
- bzoj 1590: [Usaco2008 Dec]Secret Message 秘密信息
1590: [Usaco2008 Dec]Secret Message 秘密信息 Description 贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息. 信息是二进制的,共 ...
- 【Trie】Secret Message 秘密信息
[题目链接]: https://loj.ac/problem/10054 [题意] 我认为这个题目最难的是题意: 其实分了两种情况: 1.如果当前文本串匹配不完,那么答案的是:匹配过程中遇到的模式串结 ...
- 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]
洛谷传送门,BZOJ传送门 秘密消息Secret Message Description 贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息. 信息是二进制的,共有M(1≤M≤5 ...
- [USACO08DEC] 秘密消息Secret Message
题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...
- 「USACO08DEC」「LuoguP2922」秘密消息Secret Message(AC自动机
题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...
随机推荐
- 4.彻底理解synchronized
1. synchronized简介 在学习知识前,我们先来看一个现象: public class SynchronizedDemo implements Runnable { private s ...
- http code码实验
500: 1.代码语法错误. 2.代码文件未被授权执行或访问. 502: php-fpm 未启动 302 Moved Temporarily header 跳转 404: 访问的页面不存在,或者没有权 ...
- Factorialize a Number
计算一个整数的阶乘 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120 当你完成不了挑战的时候 ...
- TCP/IP网路协议复习
1.OSI (Open System Interconnect Protocol) 开放互联协议,这是一个七层的计算机网络协议,包括:物理层.数据链路层.网络层.传输层.回话层.表示层.应用层. ...
- SPOJ 5152 Brute-force Algorithm EXTREME && HDU 3221 Brute-force Algorithm 快速幂,快速求斐波那契数列,欧拉函数,同余 难度:1
5152. Brute-force Algorithm EXTREME Problem code: BFALG Please click here to download a PDF version ...
- linux中的/usr,/var,/opt目录详解
转自:http://it.greenblogs.org/archives/2008/20113.shtml/ /usr文件系统 /usr 文件系统经常很大,因为所有程序安装在这里. /usr 里的所 ...
- 【LeetCode-128】Longest Consecutive Sequence
描述 输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) . 输入 54,55,300,12,56 输出 3 通常我们看有没有连续序列时 找某个数有没有的前后的数,比如看到5 ...
- C# 设计模式巩固 - 简单工厂模式
前言 设计模式的文章很多.鄙人不才文笔也不咋地.写这篇只为巩固下基础知识,万一不小心帮到了您,是我莫大的荣幸!写的不好欢迎码友指正,废话结束开始进入正题. 介绍 - 简单工厂模式 官方定义:(尴尬~貌 ...
- hdu 6053 TrickGCD(筛法+容斥)
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- jQuery 滑动选项卡jQuery tabulous.js
A jQuery tabs module for todays web! 实例DEMO 运行一下 Documentation Tabulous.js can be used with any cont ...