Tree-String Problem 【CodeForces - 291E】【倍增(LCA)+哈希】

2023-11-11

题目链接


  题意:给你N个点的树,树上的边的权值是一个自上往下的字符串,然后我们再给出一个字符串,是模式串,我们现在想知道模式串在树上的出现次数,譬如说样例。

  我们查找的是aba,它在1——4这条链上出现了2次,在1——5上出现1次,在2——3上出现2次,在2——6上出现1次。

 这道题的做法不是唯一的,譬如说AC自动机也可以解决这个问题

  思路:因为长度确定为模式串的长度,所以又由于总的长度最长只有3e5,所以我们不妨直接拆点来做,我们构建一副新的图,当待查询的长度不足的时候我们继续向下走,当待查询长度满足的时候,我们可以直接判断,当待查询的长度大于1的时候,我们需要用到倍增的LCA来找到上面距离它模式串长度的那个元素,并减去它的哈希值,我们再来判断。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 3e5 + 7;
const ull _hash = 1e9 + 7;
int N, head[maxN], cnt, tot, col[maxN], model_len;
ull del_tim, model;
struct Eddge
{
    int nex, to; string val;
    Eddge(int a=-1, int b=0, string c=""):nex(a), to(b), val(c) {}
}edge[maxN << 1];
inline void addEddge(int u, int v, string w)
{
    edge[cnt] = Eddge(head[u], v, w);
    head[u] = cnt++;
}
vector<int> E[maxN];
void build_dfs(int u, int now_root)
{
    string ss;
    int nex_root;
    for(int i=head[u], v, len; ~i; i=edge[i].nex)
    {
        v = edge[i].to;
        ss = edge[i].val; len = (int)ss.size();
        nex_root = now_root;
        col[++tot] = ss[0];
        E[nex_root].push_back(tot);
        nex_root = tot;
        for(int j=1; j<len; j++)
        {
            col[++tot] = ss[j];
            E[nex_root].push_back(tot);
            nex_root = tot;
        }
        build_dfs(v, nex_root);
    }
}
int root[maxN][20] = {0}, ans = 0;
int fid(int u, int x)
{
    for(int i=log2(x); i>=0; i--)
    {
        if((x >> i) & 1) u = root[u][i];
    }
    return u;
}
void dfs(int u, int have_len, ull hash_val)
{
    if(have_len == model_len)
    {
        if(hash_val == model) ans++;
    }
    else if(hash_val > model_len)
    {
        int id = fid(u, model_len);
        have_len = model_len;
        hash_val -= col[id] * del_tim;
        if(hash_val == model) ans++;
    }
    for(int v : E[u])
    {
        root[v][0] = u;
        for(int i=0; i < 18; i++) root[v][i + 1] = root[root[v][i]][i];
        dfs(v, have_len + 1, hash_val * _hash + col[v]);
    }
}
inline void init()
{
    cnt = tot = 0;
    memset(head, -1, sizeof(head));
}
int main()
{
    scanf("%d", &N);
    init();
    string s;
    for(int i=2, ff; i<=N; i++)
    {
        scanf("%d", &ff);
        cin >> s;
        addEddge(ff, i, s);
    }
    cin >> s;
    model_len = (int)s.size();
    del_tim = 1;
    for(int i=1; i<=model_len; i++) del_tim = del_tim * _hash;
    model = 0;
    for(int i=0; i<model_len; i++)
    {
        model = model * _hash + s[i];
    }
    build_dfs(1, 0);
    dfs(0, 0, 0);
    printf("%d\n", ans);
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tree-String Problem 【CodeForces - 291E】【倍增(LCA)+哈希】 的相关文章

  • Computer【HDU-2196】【在线LCA+树的直径】

    题目链接 include
  • 什么是哈希算法?

    哈希算法的基本含义 哈希是密码学的基础 理解哈希是理解数字签名和加密通信等技术的必要前提 哈希 英文是 hash 本来意思是 切碎并搅拌 有一种食物就叫 Hash 就是把食材切碎并搅拌一下做成的 哈希函数的运算结果就是哈希值 通常简称为哈希
  • 1. 两数之和 C++

    给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺
  • 哈希表 基础理论

    目录 哈希表中的常见概念 哈希函数常见的构建方式 哈希算法 解析哈希冲突的常见方式 hash 哈希 有的也翻译为散列 哈希表通常基于数组实现 元素存取效率高 java中常见的hash集合都是使用哈希表来存储元素 map HashMap Li
  • 你了解这些算法吗?SHA256、RIPEMD-160、DES、AES、RSA、ECC

    一 HASH算法 哈希散列算法和哈希摘要算法都叫做哈希算法 1 概念 把一段任意长度的数据变成均匀分布固定长度的数据 反之不可以 Hash不可逆 在任何电脑 手机 或者笔算Hash值都是一样的 y Hash x 已知x可以得到y 反之不可以
  • 六、深入理解JDK1.8中HashMap哈希冲突解决方案

    导读 前面文章一 深入理解 Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍 上两篇文章二 Jdk1 7和1 8中HashMap数据结构及源码分析 三 JDK1 7和1 8HashMap数据结构及源码分析 续 中我们分别对
  • Merkle树介绍

    默克尔树 Merkle树 又叫哈希树 是区块链数据存储运用到的一个重要的技术算法 简单来说 哈希树 默克尔树 中 每个节点都标有一个数据块的加密哈希值 哈希树可以用来验证任何一种在计算机中和计算机之间存储 处理和传输的数据 它们可以确保在点
  • Crazy Search 【POJ - 1200】【哈希】

    题目链接 题意 给定一个字符串 其中含有不同的字母数量为m 现在求这个字符串中有多少个长度为n且长的互不相同的字符子串 举个例子 n 3 m 4 字符串 daababac 长度为3的不同的子串分别是 daa aab aba bab bac
  • ​LeetCode刷题实战88:合并两个有序数组

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 合并两个有序数组 我们先来看题
  • 第四讲. 经典算法之哈希映射

    第四讲 经典算法之哈希映射 1 简介 2 从一个简单例题开始 3 哈希中的碰撞冲突 3 1 线性探测法 3 2 链地址法 3 3 再哈希法 3 4 4 哈希函数的设计 4 1 更大的哈希表 4 2 更好的哈希运算 5 最后说几句 1 简介
  • 哈希学习简介

    一 背景介绍 1 首先介绍一下最近邻搜索 最近邻搜索问题 也叫相似性搜索 近似搜索 是从给定数据库中找到里查询点最近的点集的问题 给定一个点集 以及一个查询点q 需要找到离q最近的点的集合 在大规模高维度空间的情况下 这个问题就变得非常难
  • 哈希表冲突及处理冲突的方法(含例子)

    一 哈希函数和哈希冲突的基本概念 1 哈希函数 哈希法又称散列法 杂凑法以及关键字地址计算法等 相应的表成为哈希表 基本思想 首先在元素的关键字K和元素的位置P之间建立一个对应关系f 使得P f K 其中f成为哈希函数 创建哈希表时 把关键
  • unordered_map的哈希HASH重载——举例unordered_map与pair联合使用

    有些时候 为了图省力 我们没准会这样的调用一个函数 unordered map lt pair
  • Oulipo 【POJ - 3461】【双值哈希】

    题目链接 题意 给你两个字符串 前一个是小字符串 后一个是大的字符串 问你 大的字符串中有几组可以与小的字符串相等的子字符串 此题其实不用双值哈希好像也可以的 但为了确保A就敲了个双值哈希 我们想把字符串的形式用数的值来表示 那么 我们可以
  • MySQL索引数据结构hash解析

    Hash 对索引的key进行一次hash计算就可以定位出数据存储的位置 很多时候Hash索引要比B 树索引更高效 仅能满足 IN 不支持范围查询 哈希表这种结构适用于只有等值查询的场景 比如 Memcached 及其他一些 NoSQL 引擎
  • 哈希(4) - 求两个链表的交集以及并集

    目录 1 简单方法 2 使用归并排序 3 使用哈希 给定两个链表 求它们的交集 intersection 以及并集 union 用于输出的list中的元素顺序可不予考虑 例子 输入下面两个链表 list1 10 gt 15 gt 4 gt
  • Connections between cities 【HDU - 2874】【在线LCA算法】

    题目链接 昨天刚学了在线LCA 今天就来硬刚这道题还是花了一整天的时间 不过对于LCA却有了更多的理解 这道题在讲述不同根的做法上尤其是很好的 题目告诉我们有N个节点和M条边 以及C次询问 每次查询的是 L R 这两个节点间的距离 还是算得
  • 初探BlockChain——哈希和电子签名

    昨天在B站学习到北京大学肖臻老师的 区块链技术与应用 的公开课 感到豁然开朗 BlockChain涉及到密码学的两个方面 哈希和电子签名 1 哈希 有计算机基础的童鞋都比较清楚其机制 这里再简单说一下其基本原理 哈希的意思就是引入随机数量的
  • ​LeetCode刷题实战33:搜索旋转排序数组

    来源 https www cnblogs com techflow p 12441002 html 算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家
  • Oulipo 【HDU - 1686】【哈希

    题目链接 求模式串在待匹配串的出现次数 Input 第一行是一个数字T 表明测试数据组数 之后每组数据都有两行 第一行为模式串 长度不大于10000 第二行为待匹配串 长度不大于1000000 所有字符串只由大写字母组成 Output 每组

随机推荐

  • 送本书《Python 之旅》

    在线阅读 下载 在线阅读 https www bookstack cn books explore python 下载 关注公众号马上码回复 pythonzl Python 是一门面向对象 解释型的高级程序设计语言 它的语法非常简洁 优雅
  • 分析游戏《明日方舟》的成功要素

    明日方舟 这个出身并不显赫 玩法也绝非时下主流的游戏一经上线 就在一个月内连续霸榜 在正式上线一个月的时候 顺理成章地登顶App Store畅销榜榜首 简单介绍游戏信息与核心玩法 游戏名称 明日方舟 英文名称 Arknights 制作厂商
  • element-ui el-tree树形控件 默认箭头更改

    这是基础性 那么怎么修改呢 很简单只需要在css中修改 注意 vue中修改需要添加 deep el icon arrow right color 49c0ff el table el table expand icon el icon ar
  • 秒杀多线程第十五篇 多线程十大经典案例之一 双线程读写队列数据

    秒杀多线程第十五篇 多线程十大经典案例之一 双线程读写队列数据 多线程十大经典案例之一双线程读写队列数据 案例描述 MFC对话框中一个按钮的响应函数实现两个功能 显示数据同时处理数据 因此开两个线程 一个线程显示数据 开了一个定时器 响应W
  • jdk 16中改进的ZGC

    内存对象重定位的优化 预留堆空间 heap reserve 是堆空间中特殊的一块小空间 无法用于java线程的常规分配 而当发生gc时需要进行对象重分配时才会使用 此举确保了空的堆区域可用 即使是在java线程角度看堆空间已满 仍可进行对象
  • arch/x86/entry/syscall_64.o:(.rodata+0xa78): undefined reference to `sys_get_pid_info‘

    今天添加系统调用以后 使用make指令编译内核的时候出现了 arch x86 entry syscall 64 o rodata 0xa78 undefined reference to sys myprint 这个错误 错误原因是我使用的
  • SVN创建分支与合并分支

    SVN创建分支与合并分支 SVN忽略target文件夹 SVN创建分支 SVN合并分支 merge a range of revisions merge two different trees 合并分支总结 SVN忽略target文件夹 鼠
  • Web安全神器-Burpsuite社区版/专业版下载、安装及使用教程

    一 Burpsuite下载 Burp Suite是进行Web应用安全测试的一个集成平台 无缝融合各种安全工具并提供全面的接口适配 支持完整的Web应用测试流程 从最初的映射和应用程序的攻击面分析到发现和利用安全漏洞等领域均适用 同时还可以做
  • google浏览器chrome安装插件方法

    该方法适合安装到一台没有联网的机器上使用 1 在可联网的浏览器 可以用极速浏览器 上 打开扩展程序 搜到要安装的插件并安装 2 地址栏输入 chrome version 查看个人资料路径 该目录下的Extensions就是插件安装位置 3
  • 3D 重构的一些应用场景

    3D 重构是利用2D 照片合成3D 图像 3D重构也是人工智能领域的一个分支 因为业界有很多应用 所以记下来 供大家参考 第一次遇到3D重构的课题是老东家在物流领域的业务场景 后来发现 3D重构的应用场景还真不少 3D重构一个重要指标是精准
  • 移植lwIP至U-Boot

    原文地址 http www wl chuang com blog 2011 11 04 porting lwip to uboot U Boot是嵌入式系統上被廣為運用的boot loader 它擁有極為活躍的開發社群 也支援許多不同類型的
  • hadoop在windows上的环境配置及HDFS API编程示范

    1 将Hadoop压缩包解压放在指定目录 2 Hadoop本地环境配置 新建一个HADOOP HOME 添加path 3 安装maven 解决java开发依赖问题 这里可以直接去官网上下载 https maven apache org
  • C#基础知识篇:C#网络编程(Socket)使用poll函数判断连接断开问题

    C Socket使用poll函数判断连接断开问题 最近在学习c 的网络编程内容 遇到这样一个问题 在服务器端 如何判断客户端的一个连接是否断开 查找相关资料 得出较好的解决方案是使用socket对象的poll函数 poll函数分析 下面是p
  • 力扣2414:最长的字母序连续子字符串的长度

    311周赛第二题 原题链接 2414 最长的字母序连续子字符串的长度 题目 字母序连续字符串 是由字母表中连续字母组成的字符串 换句话说 字符串 abcdefghijklmnopqrstuvwxyz 的任意子字符串都是 字母序连续字符串 例
  • 计算机网络是由负责,计算机网络应用基础

    41 当进行网络互联时 如果总线网的网段已超过最大距离 可用 来增强信号 以便使信号传输更远的距离 A 中继器 B 网卡 C 网关 D 路由器 42 网络中所使用的互联设备Hub称为 A 集线器 B 路由器 C 服务器 D 网关 43 是属
  • Modelling Context and Syntactical Features for Aspect-based Sentiment论文阅读笔记(ACL2020)

    目录 原文翻译 基于方面的情感分析的上下文和句法特征建模 摘要 1 介绍 2 相关工作 3 方法提出 3 1 方面提取 3 1 1 输入表示 3 1 2 词性嵌入 3 1 3 基于依赖关系的嵌入 3 1 4 微调过程 3 2 方面情感分类
  • 算法练习——力扣随笔【LeetCode】【C++】

    文章目录 LeetCode 练习随笔 力扣上的题目和 OJ题目相比不同之处 定义问题 排序问题 统计问题 注意事项 玄学 新 get 1 单调栈 2 滑动窗口 3 auto 应用 c 11 STL 4 sort 内嵌式规则 5 实现无删遍历
  • Python爬虫 如何利用浏览器获取JSON数据,如获取淘宝天猫的评论链接?

    浏览器 Chrome 工具 右键 检查 N 步骤 1 打开淘宝 天猫 2 右键 检查 3 随便点击一个商品进入购买界面 4 点击监控工具 Network Json 5 点击 商品评论 6 下拉到评论翻页处 7 点击 监控工具Clear功能
  • 微信小程序登录获取不到头像和昵称解决办法!

    微信小程序登录获取不到头像和昵称主要原因是 小程序wx getUserProfile接口被收回 大家可以按照文档操作 PS 针对小程序wx getUserProfile接口将被收回后做出的授权调整 小程序文档中提出的调整说明 对于此次变化
  • Tree-String Problem 【CodeForces - 291E】【倍增(LCA)+哈希】

    题目链接 题意 给你N个点的树 树上的边的权值是一个自上往下的字符串 然后我们再给出一个字符串 是模式串 我们现在想知道模式串在树上的出现次数 譬如说样例 我们查找的是aba 它在1 4这条链上出现了2次 在1 5上出现1次 在2 3上出现