2021年CCCC天梯赛L3 还原文件题解
发布日期:2021-05-10 10:39:09 浏览次数:18 分类:精选文章

本文共 1858 字,大约阅读时间需要 6 分钟。

纸条的拼接问题可以通过构建字符串哈希值并用动态规划的方法来解决。首先,构建哈希值数组和位移乘幂表,然后为每个纸条计算哈希值,最后用动态规划确定正确的拼接顺序。

解决方案

方法思路

为了解决这个问题,我们需要将碎纸机中的纸条按照正确的顺序拼接起来。每个纸条的断口信息可以看作一个模式,而我们需要将其匹配到没有被切碎的半张纸的主字符串中。下面的方法将被用来实现这一点:

  • 构建哈希数组:我们使用前缀哈希方法计算主字符串的哈希值,以及每个纸条的哈希值。哈希值可以表示为类似哈希函数的计算方式。
  • 构建倍增表:为了计算不同长度字符串的哈希值,需要使用倍增的幂表。
  • 动态规划搜索:对于每个纸条,尝试从当前拼接位置开始匹配主字符串。如果匹配成功,则继续检查后续的部分,直到完全匹配结束。
  • 这样,通过将纸条视为文本中的模式,我们可以高效地找到正确的拼接顺序。

    解决代码

    #include 
    #include
    #include
    #include
    using namespace std;typedef unsigned long long ULL;const int N = 100010, M = 110, P = 131;int n, m;ULL h[N], p[N];int width[M];ULL g[M];bool st[M];int ans[M];// 计算子串 [l..r) 的哈希值ULL getHash(int l, int r) { return h[r] - h[l] * p[r - l];}bool tryMatch(int pos, int end) { if (end >= n) return true; for (int i = 1; i <= m; ++i) { if (!st[i] && g[i] == getHash(end, end + width[i])) { st[i] = true; ans[pos] = i; if (tryMatch(pos + 1, end + width[i])) return true; st[i] = false; } } return false;}int main() { // 读取N scanf("%d", &n); // 读取N个高度值 h[0] = 0; for (int i = 1; i <= n; ++i) { int x; scanf("%d", &x); p[i] = p[i - 1] * P; h[i] = h[i - 1] * P + x; } // 读取M scanf("%d", &m); // 读取M个纸条的width for (int i = 1; i <= m; ++i) { width[i] = 0; int x; scanf("%d", &x); while (width[i] < x) { width[i]++; } // 读取每个纸条的断口信息 g[i] = getHash(0, 0 + width[i]); } // 初始调用 fill(st, st + m + 1, false); tryMatch(1, n); // 输出ans数组 for (int i = 1; i <= m; ++i) { printf("%d", ans[i]); if (i != m) printf(" "); } return 0;}

    代码解释

  • 输入处理:读取输入数据,构建哈希数组和倍增幂表。
  • 哈希值计算:使用前缀哈希方法计算每个子字符串的哈希值,确保快速比较。
  • 动态规划搜索:逐个试着将纸条拼接到当前的拼接结果中,如果匹配成功,则继续查找后续部分,直到完全匹配为止。
  • 通过这种方法,我们可以高效地解决纸条的拼接问题,确保正确顺序的输出。

    上一篇:leetcode第238场周赛最高建筑高度
    下一篇:2021CCCC天梯赛L2题解

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月24日 10时35分29秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    echarts 如何在一条柱形显示两个数字_干货 | 如何快速制作数据地图?让你的可视化逼格再高一级!... 2023-01-24
    eclipse设置utf8编码_记住没:永远不要在 MySQL 中使用 UTF8 2023-01-24
    eclipse里source的快捷方法_Eclipse快捷键/快捷操作汇总 2023-01-24
    elasticsearch 查询_Elasticsearch地理信息存储及查询之Geo_Point 2023-01-24
    embedding层_【预估排序】Embedding+MLP: 深度学习预估排序通用框架(一) 2023-01-24
    excel中最常用的30个函数_Excel玩转数据分析常用的43个函数! 2023-01-24
    flink sql设置并行度_Flink 参数配置和常见参数调优 2023-01-24
    go 字符串替换_Go 每日一库之 quicktemplate 2023-01-24
    hex editor neo下载_口袋妖怪爆焰黑手机版下载-口袋妖怪爆焰黑手游下载v4.3.0 安卓版... 2023-01-24
    hibernate mysql 关联查询_spring-boot hibernate 双向关联查询的坑 2023-01-24
    hive 建表_sqoop的使用之导入到hive和mysql 2023-01-24
    hp工作站z8装Linux,惠普Z8G4双路最小工作站 2023-01-24
    html上传图片直接保存到数据库中,Editor上传图片路径存入数据库中怎么弄? 2023-01-24
    html游戏玩不了,WinXP网页游戏玩不了怎么办有哪些解决方法 2023-01-24
    html转jsp_JSP详解 2023-01-24
    ICLOUD储存空间要升级吗_有人像我一样需要恢复苹果手机icloud空间ios备份时 微信卡住不动了吗(已解决)... 2023-01-24
    image unity 原始尺寸_Unity基础教程-对象管理(十一)——生命周期(Growth and Death)... 2023-01-24
    iphone打字怎么换行_手持iPhone?你可能并不知道的小技巧! 2023-01-24
    jaccard相似度_自然语言处理之文本相似度计算 2023-01-24
    java 8 list对象属性判空_java ---- 认识类对象,属性和方法 2023-01-24