[SDOI2007]游戏【哈希+DAG拓扑】

2023-10-26

题目链接


先通过哈希确定点,这里我使用的是双值哈希。然后利用哈希判断可以和前面的出现的点如何链接。

之后构造出来的图一定是一副DAG图,有向无环图,所以直接拓扑排序DP即可。

#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
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const ull h1 = 29, h2 = 31;
const int maxN = 1e4 + 7;
int N = 0, num[26];
ull b1[27], b2[27];
char s[maxN][105];
map<pair<ull, ull>, int> mp;
pair<ull, ull> id[maxN];
void Pre_did()
{
    b1[0] = b2[0] = 1;
    for(int i=1; i<26; i++)
    {
        b1[i] = b1[i - 1] * h1;
        b2[i] = b2[i - 1] * h2;
    }
}
int head[maxN], cnt = 0, du[maxN];
struct Eddge
{
    int nex, to;
    Eddge(int a=-1, int b=0):nex(a), to(b) {}
}edge[maxN << 1];
inline void addEddge(int u, int v)
{
    edge[cnt] = Eddge(head[u], v);
    head[u] = cnt++;
}
int dp[maxN], pre[maxN], ans_val, ans_id;
queue<int> Q;
inline void tp()
{
    while(!Q.empty()) Q.pop();
    for(int i=1; i<=N; i++) if(!du[i]) { Q.push(i); dp[i] = 1; pre[i] = 0; ans_val = 1; ans_id = i; }
    while(!Q.empty())
    {
        int u = Q.front(); Q.pop();
        for(int i=head[u], v; ~i; i=edge[i].nex)
        {
            v = edge[i].to;
            if(dp[u] + 1 > dp[v])
            {
                dp[v] = dp[u] + 1;
                pre[v] = u;
            }
            if(dp[v] > ans_val)
            {
                ans_val = dp[v];
                ans_id = v;
            }
            du[v]--;
            if(!du[v]) Q.push(v);
        }
    }
}
int main()
{
    Pre_did();
    while(scanf("%s", s[++N]) != EOF)
    {
        du[N] = 0; head[N] = -1;
        int len = (int)strlen(s[N]);
        memset(num, 0, sizeof(num));
        for(int i=0; i<len; i++) num[s[N][i] - 'a']++;
        ull hash_val_1 = 0, hash_val_2 = 0, tmp_1, tmp_2;
        for(int i=0; i<26; i++)
        {
            hash_val_1 = hash_val_1 + (ull)num[i] * b1[i];
            hash_val_2 = hash_val_2 + (ull)num[i] * b2[i];
        }
        id[N] = MP(hash_val_1, hash_val_2);
        mp[id[N]] = N;
        for(int i=0; i<26; i++)
        {
            tmp_1 = hash_val_1 - b1[i]; tmp_2 = hash_val_2 - b2[i];
            if(mp[MP(tmp_1, tmp_2)])
            {
                du[mp[MP(tmp_1, tmp_2)]]++;
                addEddge(N, mp[MP(tmp_1, tmp_2)]);
            }
            tmp_1 = hash_val_1 + b1[i]; tmp_2 = hash_val_2 + b2[i];
            if(mp[MP(tmp_1, tmp_2)])
            {
                du[N]++;
                addEddge(mp[MP(tmp_1, tmp_2)], N);
            }
        }
        if(!mp[MP(hash_val_1, hash_val_2)]) mp[MP(hash_val_1, hash_val_2)] = N;
    }
    N--;
    tp();
    printf("%d\n", ans_val);
    while(ans_id)
    {
        printf("%s\n", s[ans_id]);
        ans_id = pre[ans_id];
    }
    return 0;
}

 

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

[SDOI2007]游戏【哈希+DAG拓扑】 的相关文章

  • 什么是哈希算法?

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

    题目链接 先通过哈希确定点 这里我使用的是双值哈希 然后利用哈希判断可以和前面的出现的点如何链接 之后构造出来的图一定是一副DAG图 有向无环图 所以直接拓扑排序DP即可 include
  • 哈希表 基础理论

    目录 哈希表中的常见概念 哈希函数常见的构建方式 哈希算法 解析哈希冲突的常见方式 hash 哈希 有的也翻译为散列 哈希表通常基于数组实现 元素存取效率高 java中常见的hash集合都是使用哈希表来存储元素 map HashMap Li
  • Merkle树介绍

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

    A Integer Diversity 题目 思路分析 就是给你一个序列 通过改变数字的正负 可以得到最大不同数字的个数是多少 代码分析 include
  • 电子科技大学人工智能期末复习笔记(四):概率与贝叶斯网络

    目录 前言 概率 概率公式 贝叶斯公式 链式条件概率 例题 1 求联合概率分布 边缘概率分布 条件概率分布 2 灵活运用贝叶斯公式 概率总结 贝叶斯网络 判断独立性 两个事件独立的判断 条件独立性的判断 假设条件独立的链式法则 Active
  • 【无标题】vxworks ARM Pl330DMA 数据传输指令流创建

    pl330DmaChanMicroCodeCreate create micro code for dma transfer This routine create micro code for dma transfer RETURNS O
  • ​LeetCode刷题实战88:合并两个有序数组

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

    一 背景介绍 1 首先介绍一下最近邻搜索 最近邻搜索问题 也叫相似性搜索 近似搜索 是从给定数据库中找到里查询点最近的点集的问题 给定一个点集 以及一个查询点q 需要找到离q最近的点的集合 在大规模高维度空间的情况下 这个问题就变得非常难
  • 2021-05-28

    什么是散列表 散列表 散列表 Hash table 也叫哈希表 是根据键 Key 而直接访问在内存存储位置的数据结构 也就是说 它通过计算一个关于键值的函数 将所需查询的数据映射到表中一个位置来访问记录 这加快了查找速度 这个映射函数称做散
  • 一点点学共形几何(1) 微分几何之拓扑空间简介

    本人计算机专业的 本想直接学习顾险峰老师的计算共形几何学课程 但无奈看起来很吃力 于是想补一点基础拓扑学 但是拓扑学又涉及到微分几何 于是找来梁灿彬老师的 微分几何入门与广义相对论 打算拜读前五章 此文章为阅读时的一些笔记 但是这种书吧不可
  • MySQL索引数据结构hash解析

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

    目录 1 简单方法 2 使用归并排序 3 使用哈希 给定两个链表 求它们的交集 intersection 以及并集 union 用于输出的list中的元素顺序可不予考虑 例子 输入下面两个链表 list1 10 gt 15 gt 4 gt
  • 哈希及其应用(字典,加密等)

    一 名词说明 Hash 一般翻译做散列 杂凑 或音译为哈希 是把任意长度的输入 又叫做预映射pre image 通过散列算法变换成固定长度的输出 该输出就是散列值 这种转换是一种压缩映射 也就是 散列值的空间通常远小于输入的空间 不同的输入
  • C++打印hello world

    首先我们要知道 C 中有一个很重要的东西 那就是面向对象 其中 C 中的打印和输入都是一个对象 而不是像C一样是一个函数 所以打印和输入都有一定的区别 打印是C 最基础的东西 下面我们先放代码 再逐条分析 include
  • 初探BlockChain——哈希和电子签名

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

    哈希函数 散列算法 根据某个值进行hash值计算 确保唯一性 public class HashUtils private static final String ALGORITHM SHA 256 public static String
  • Oulipo 【HDU - 1686】【哈希

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

    离散数学第一章 1 公式类型 1 重言式 也是永真式 公式真值恒为1 2 矛盾式 永假式 真值恒为0 3 可满足式 不是矛盾式的就都是可满足式 重言式一定是可满足式 2 成真赋值与成假赋值 也叫成真指派与成假指派 一组原子的取值 真值指派
  • HashMap中为何X % length = X & (length - 1)(求余%和与运算&转换问题)

    目录 一 引出问题 二 结论 三 分析过程 总结 一 引出问题 在前面讲解 HashMap 的源码实现时 有如下几点 初始容量为 1 lt lt 4 也就是24 16 负载因子是0 75 当存入HashMap的元素占比超过整个容量的75 时

随机推荐

  • 归并排序,自顶向下,自底向上

    http blog csdn net cjf iceking article details 7920153
  • 9大代理服务器软件的比较与分析之CCProxy、Squid

    原博客链接 仅用于个人学习记录 代理服务器不仅可以为局域网内的PC提供代理服务 还可以为基于Windows网络的用户提供代理服务 而且代理服务的实现十分简单 它只需在局域网的一台服务器上运行相应的服务器端软件即可 目前代理服务器软件产品主要
  • 谷歌gcp 远程计算机_什么是Google Cloud Platform(GCP)?

    谷歌gcp 远程计算机 Google Cloud Platform is a suite of cloud computing services which is provided by Google Google Cloud Platfo
  • MySQL服务器安装(轻松带你安装)

    文章目录 一 MySQL服务器安装 一 先卸载 二 开始安装 一 MySQL服务器安装 注意事项 1 安装路径不要出现中文 中文符号 2 尽量不要装到C盘 系统盘 安全性高 通常需要管理员权限执行 一 先卸载 我之前已经安装过了 所以我要先
  • 分布式的登录如何实现的

    1 单机登录 user在server上输入用户名密码等 完成用户信息校验并将对应的信息写入server的session中 2 分布式框架的登录方案 使用redis 即通过key value的方式 在server1完成登录后 将用户信息以va
  • 润和HCIP认证套件的烧写问题的终极解决方案

    目录 问题的由来 烧写问题 启动问题 总结 问题的由来 润和HarmonyOS鸿蒙开发板 HiSpark AI Camera开发套件 下图 是OpenHarmony的小型设备和标准设备的代表 基于华为海思Hi3516DV300芯片 支持Li
  • VMware下,私有云平台的配置(CentOS 7系统,含桌面)

    文章目录 实验环境 Windows系统 VMWare 15 1 0 CentOS 7 x86 64 Minimal 1810 iso映像文件 1 安装CentOS系统 2 实现远程桌面连接 实验环境 Windows系统 VMWare 15
  • Tensorflow入门--用tensorflow实现一个三层的神经网络

    前言 这段时间在学习吴恩达的深度学习视频 前面博客中一直在利用numpy自己构造网络框架实现前向传播 损失函数 反向传播 优化等 在这一篇博客中将实现利用tensorflow库里的函数直接实现上面所说的功能 使整个程序更加简洁 最后 如果有
  • 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI

    汉诺塔 汉诺塔II hdu1207 先说汉若塔I 经典汉若塔问题 有三塔 A塔从小到大从上至下放有N个盘子 如今要搬到目标C上 规则小的必需放在大的上面 每次搬一个 求最小步数 这个问题简单 DP a n a n 1 1 a n 1 先把
  • HTML(的简单表格)的案例

    1 简单的表格 代码 table border 2 width 400px height 200px align center cellspacing 10 cellpadding 0px tr align right valign top
  • 【ML】XGBoost 算法:愿它统治万岁!

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • css使用行内注释报错_在CSS中使用注释

    css使用行内注释报错 It is a very good working practice to comment your code in CSS Comments serve two major functions 在CSS中注释您的代
  • uniapp组件深度修改样式问题

    问题一 样式类型scss less css 如果公共样式为common scss 对应的App vue文件必须加上lang scss 问题二 深入修改样式 当前页面修改 带scoped css样式
  • 系统安装部署系列教程(四):制作PE系统

    Win PE全程叫做Windows预安装系统 是Windows系统运行所必须的所有组件的最小集合 可能这么说大家感觉比较绕 简单来说 PE系统就是用来安装和修复系统的工具系统 最主要的作用就是用来重装系统 当然PE系统的作用并不是仅仅用来重
  • 【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)

    需要源码和资源包请点赞关注收藏后评论区留言私信 一 效果演示 如下图所示 飞机拆装后 单击零件 将会出现零件说明功能 看上去十分有科技感和美观 演示视频如下 零件高亮及显示说明 二 实现步骤 首先双击打开Level6 UI场景 接下来的步骤
  • 项目上线质量如何评估

    一 项目上线质量指标 你认为用什么质量指标可以反映项目 上线的一个质量 你可能会想那不是有很多质量指标么 多数和BUG相关 例如BUG数量 重新打开BUG数 BUG解决时长等等 好像都能体现上线质量啊 可仔细想想 我们衡量上线质量 不能只看
  • 【ML】AdaBoost:实用介绍及如何使用 Python 进行分类和回归

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • sdio tf卡基础知识总结

    sdio介绍 SDIO的全称是安全数字输入 输出接口 一般都是用来SD卡 SD I O 卡 MMC卡进行通讯 SDIO总线拥有9根线 一个CLK时钟线 四条DATA双向数据线 一条双向指令线CMD VDD VSS1 VSS2电源和地信号线
  • GIT常用命令

    文章目录 前言 一 必备命令 rebase 变基 merge branch reset revert 二 将本地项目推送到远程 总结 问题 references 前言 当前工作区 add gt stage commit gt 本地仓库 pu
  • [SDOI2007]游戏【哈希+DAG拓扑】

    题目链接 先通过哈希确定点 这里我使用的是双值哈希 然后利用哈希判断可以和前面的出现的点如何链接 之后构造出来的图一定是一副DAG图 有向无环图 所以直接拓扑排序DP即可 include