
训练总结报告
枚举所有可能的子串:遍历字符串中的所有可能的子串,包括所有可能的起始位置和长度。 去重:使用哈希表存储已经处理过的子串,避免重复处理相同的子串。 计算出现次数:对于每个唯一的子串,使用KMP算法计算它在原始字符串中的不重叠出现次数。 计算替换后的总长度:对于每个子串,计算替换后的总长度,并记录最小值。 返回最小长度:最后返回替换后最小的总长度。 computeKMPFail:这是KMP算法中的失败函数,用于计算每个位置的最大前缀匹配长度。 kmpFind:使用KMP算法在文本中找到所有不重叠的子串匹配,并返回匹配次数。 main:主函数,读取输入字符串,枚举所有可能的子串,去重,然后计算每个子串的替换次数和总长度,最后输出最小的总长度。
发布日期:2021-05-14 13:34:50
浏览次数:18
分类:精选文章
本文共 2393 字,大约阅读时间需要 7 分钟。
为了解决这个问题,我们需要找到一种方法来最小化传输给罗佛的指令长度。具体来说,我们需要将原始字符串中的某些子串替换为'M',以减少总长度。
方法思路
我们可以通过以下步骤来解决这个问题:
这种方法通过枚举所有可能的子串,并使用KMP算法高效地计算出现次数,确保在合理的时间内找到最优解。
解决代码
#include#include using namespace std;int computeKMPFail(const string &pattern) { int m = pattern.size(); int fail[m] = {0}; for (int i = 1; i < m; ++i) { int j = fail[i - 1]; while (j > 0 && pattern[i] != pattern[j]) { j = fail[j]; } if (pattern[i] == pattern[j]) { j++; } fail[i] = j; } return *fail; } int kmpFind(const string &text, const string &pattern, int &count) { int n = text.size(); int m = pattern.size(); if (m == 0 || n < m) return 0; int fail[] = computeKMPFail(pattern); int j = 0; count = 0; for (int i = 0; i < n; ++i) { while (j > 0 && text[i] != pattern[j]) { j = fail[j - 1]; } if (text[i] == pattern[j]) { j++; if (j == m) { count++; j = fail[j - 1]; } } } return count; } int main() { string s; cin >> s; int len = s.size(); if (len == 0) { cout << 0; return; } unordered_set uniqueSubs; for (int i = 0; i < len; ++i) { for (int j = i + 1; j <= len; ++j) { string sub = s.substr(i, j - i); uniqueSubs.insert(sub); } } int minTotal = len; for (const string &sub : uniqueSubs) { int count = 0; kmpFind(s, sub, count); int replace = sub.size() * count; int total = len - replace; if (total < minTotal) { minTotal = total; } } cout << minTotal; return; }
代码解释
通过这种方法,我们能够高效地找到最优解,确保传输指令的长度最小。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月07日 01时21分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
并查集(求连通块数量)
2019-03-11
最大半连通子图
2019-03-11
Remove Extra one 维护前缀最大最小值
2019-03-11
跳台阶
2019-03-11
另类加法,走方格的方案数,最近公共祖先
2019-03-11
线程学习5
2019-03-11
[Java Path Finder][JPF学习笔记][7]JPF输出详细程度设置
2019-03-11
GitHub完整记录数据库GHTorrent的下载和安装经验
2019-03-11
设计模式—— 三:依赖倒置原则
2019-03-11
SpringBoot打包之后乱码
2019-03-11
因SGA分配错误无法启动数据库
2019-03-11
Oracle修改字段类型方法总结
2019-03-11
ORA-00020 超过当前最大连接数
2019-03-11
合理控制oracle数据库具有DBA权限的用户
2019-03-11
喝红茶是否会上火
2019-03-11
Android进阶解密读书笔记2——第2章:Android系统启动——第1、2小节
2019-03-11
GreenDao之注解
2019-03-11
Android使用Font Awesome
2019-03-11