
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;}
代码解释
通过这种方法,我们可以高效地解决纸条的拼接问题,确保正确顺序的输出。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月24日 10时35分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
eclipse设置utf8编码_记住没:永远不要在 MySQL 中使用 UTF8
2023-01-24
eclipse里source的快捷方法_Eclipse快捷键/快捷操作汇总
2023-01-24
excel中最常用的30个函数_Excel玩转数据分析常用的43个函数!
2023-01-24
flink sql设置并行度_Flink 参数配置和常见参数调优
2023-01-24
go 字符串替换_Go 每日一库之 quicktemplate
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
iphone打字怎么换行_手持iPhone?你可能并不知道的小技巧!
2023-01-24
jaccard相似度_自然语言处理之文本相似度计算
2023-01-24
java 8 list对象属性判空_java ---- 认识类对象,属性和方法
2023-01-24