hash
 

Description

dr所在国度的有个奇怪的规定:他们的字母不是a~z,而是用1~1000表示。

利用这个奇怪的规定,dr想出了一个好玩的游戏:首先给出n个字符串(当然每个字符用1~1000表示),然后给出有m个节点的树,节点编号1~m,这棵树以1号节点为根,每个节点都包含一个字符。现在要求用从根节点到其他m-1个节点的链上的字符组成m-1个新字符串(字符的排列顺序为从根到终点的顺序)。

是否这m-1个新字符串中的任意一个串,都与给出的n个字符串中至少一个串匹配呢?

字符串S与字符串T匹配:设len1=∣S∣,len2=∣T∣len1=|S|,len2=|T|len1=∣S∣,len2=∣T∣,则S1=T1,S2=T2,...,Slen1=Tlen1S_{1}=T_{1},S_{2}=T_{2},...,S_{len1}=T_{len1}S1​=T1​,S2​=T2​,...,Slen1​=Tlen1​ 且 len1≤len2len1 \leq len2len1≤len2

Input

第一行输入nnn和mmm,表示有nnn个字符串,树的节点数为m(n≤103,m≤2∗105)m(n \leq 10^3,m \leq 2 * 10^5)m(n≤103,m≤2∗105)

接下来nnn行,每行首先输入一个整数kkk,代表字符串长度,然后输入kkk个整数,代表字符串Si(∣Si∣,∑∣Si∣≤2∗105)S_{i}(|Si|,\sum |Si| \leq 2 * 10^5)Si​(∣Si∣,∑∣Si∣≤2∗105)

接下来一行,输入mmm个整数CiC_{i}Ci​,表示树上第iii个节点上的字符

接下来m−1m-1m−1行,每行输入2个整数u,v(1≤u,v≤m)u,v(1 \leq u,v \leq m)u,v(1≤u,v≤m),表示uuu和vvv有一条边

Output

输出占一行,都能匹配输出YES,否则输出NO

Sample Input 1

1 4
4 1 2 3 4
1 2 3 2
1 2
2 3
1 4

Sample Output 1

YES

思路:运用hash算法将字符串进行哈希,并用unordered_map储存(因为哈希的值会很大,有ull那么大,用普通的数组存不下,故考虑用map,而且没必要排序
,所以用unordered_map提高效率。ps:以前没用过map,这几次遇到的题用map都巨方便,运用桶排序的思维,且可以查询任意类型)。然后用dfs查询所有
字典树出现的串的情况就OK了。
贴一发文钧菊苣的代码
 #include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> VI;
//head
const int MX=2e5+;
const int has=;
const double eps=1e-;
int n,m;
int val[MX];
VI E[MX];
unordered_map<ull,int>vis;
int dfs(int u,int fa,ull h){
int res=;//在保证了根节点满足条件的情况下的初始值
for(auto v:E[u]){
if(v==fa) continue;
if(!vis[h*has+val[v]]){
return ;
}
res&=dfs(v,u,h*has+val[v]);
}
return res;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){//字符串总数
int k;scanf("%d",&k);
ull h=;
for(int j=;j<k;j++){
int x;scanf("%d",&x);//每串字符的内容
h=h*has+x;
vis[h]=;//hash每串字符的前缀串并标记对应hash值
}
}
for(int i=;i<=m;i++) //对应字符
scanf("%d",&val[i]);
for(int i=;i<m;i++){//树结构
int u,v;scanf("%d%d",&u,&v);
E[u].pb(v);E[v].pb(u);//建树
}
ull h=val[];
if(!vis[h]) puts("NO");
else{
if(dfs(,-,h)) puts("YES");
else puts("NO");
}
return ;
}

选拔赛 hash 字符串匹配 哈希算法(白书p374)的更多相关文章

  1. Hash——字符串匹配(求s1在s2中出现的次数)

    题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A  中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BA ...

  2. 实现字符串匹配的KMP算法

    KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s. 首先我们从整体来把我这个算法的思想. 字符串匹配的朴素算法: 我们容易想到朴素算法, ...

  3. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  4. 字符串匹配的 Boyer-Moore 算法

    上一篇文章,我介绍了 字符串匹配的KMP算法 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的” 查找” 功能(Ctrl+F),大多采用 Boyer-Moore 算法. 下面,我根据 M ...

  5. 字符串匹配的 KMP算法

    一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...

  6. 字符串匹配的kmp算法 及 python实现

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  7. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  8. 字符串匹配(KMP 算法 含代码)

    主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...

  9. 分布式_理论_08_Consistent Hash(一致性哈希算法)

    一.前言 五.参考资料 1.分布式理论(八)—— Consistent Hash(一致性哈希算法)

随机推荐

  1. Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍

    题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍 代码如下: package com.itheima.gan; /** * 子线程执行10次后,主线程再运行5次,这样交替执行三遍 * @a ...

  2. 图形化编程娱乐于教,Kittenblock实例,测试声音的响度

    跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关键的问题在于,带入感,我能给出的建议,就是咬咬牙,坚持住,没有学不会的知 ...

  3. 分布式场景下Kafka消息顺序性的思考

    如果业务中,对于kafka发送消息异步消费的场景,在业务上需要实现在消费时实现顺序消费, 利用kafka在partition内消息有序的特点,消息消费时的有序性. 1.在发送消息时,通过指定parti ...

  4. diverta 2019 Programming Contest 2自闭记

    A 签到(a-b problem不用贴了吧,以后atcoder小于300分题均不贴代码) B 发现选择的p,q一定是其中两点间的距离,于是可以O(n2)枚举两点,再O(n2)判断,其实可以做到O(n3 ...

  5. 控制台输出<迷你DVD管理>

    使用顺序.选择.循环.跳转语句 数组 功能实现菜单显示和切换 输入的数字不符合要求直接退出程序 用户可以选择新增.查看. 删除.借出.归还.退出 思路分析 使用switch语句实现菜单选择 使用do- ...

  6. 四十三、LAMP与LNMP web架构深度优化实战-第二部

    1. 配置nginx gzip压缩功能    服务器对发出的内容进行压缩,带宽少了,体验好,速度快,但是服务端压,会使cpu使用高,压缩比高的进行压缩:文本.程序文件.数据文件.图片视频不要压缩,一般 ...

  7. java第三方工具包

    --搜集于网络 1.Apache POI 处理office文档用到的2. IText PDF操作类库 3.Java Base64 Base64编码类库 4.Commons-lang 对应java sd ...

  8. 云服务器上安装MSF环境

    在校园网内,禁止使用路由器之类的,所以就导致自己本地虚拟机环境出现各种各样的网络问题,解决起来过于繁琐,为此在服务器上安装MSF 0x00 安装MSF 使用Xshell等工具连上远程服务器后,首先确保 ...

  9. soap,restful 两种web service实现方式比较

    web service服务 目前常用的实现web service的方式有有两种 1.SOAP 原始的web service标准,一堆标准,不过这些标准是在开发框架中实现的,有上层接口,可以调用 2.R ...

  10. 实现TabControl 选项卡首个标签缩进的方法

    借用一张网图说明需求 在网上找了一圈,没有找到直接通过API或者重绘TabControl 的解决方法,最后灵机一动想到了一个折(tou)中(lan)的解决办法 Tab1.TabPages.Clear( ...