abc 214G Three Permutations
2021/8/16 23:10:14
本文主要是介绍abc 214G Three Permutations,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题面
翻译
给出一个字符串, 问用以下方式构造出的字符串有多少种不同的选择(两种选择不同当且仅当两个字符串不相同), 输出答案 \(mod (1e9 + 7)\) 的结果:
- 在原序列选择一些位置, 并保证它们两两不相邻。
- 将未选择的位置删除。
- 得到新的字符串
题解
考虑每一个位置, 它如果接在一个字符串后面, 其实方案数与前一个字符的位置无关, 只与前面一个字符是啥相关。 所以我们可以用一个DP来记录来记录在这个位置前一个(因为不能相邻)之前以第 \(i\) 种字符结尾的方案总数。 而当前位置更新答案时候只需要用 \(1 + \sum_i^26 dp[i]\) 就可以了, 不过这里要注意, 算出来了不能立刻更新, 要等算完下一个位置再更新(不能相邻)。 有些人可能会觉得这样做会有重复, 但其实不会, 因为对于 \(l\) 位置的第 \(i\) 种字符, 上一个第 \(i\) 种字符的位置上的值经过更新会直接被丢掉, 也就是说它不会再直接影响答案了。
代码
实现方法1:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define MAXN 200000 #define INF 1000000007 char s[MAXN + 5]; long long dp[26 + 5]; int main () { int n; long long sum = 0;//用于更新和记录答案 long long last = 0;//用于记录要延迟更新的值 int t = 0;//用于标记延迟更新的位置, (其实主要是第一个位置不用的话需要特判, 说白了就是懒) scanf ("%s", s + 1); n = strlen (s + 1); for (int i = 1; i <= n; i ++) { long long x = sum + 1; x %= INF; sum += (last - dp[t]); sum %= INF; sum += INF; sum %= INF; dp[t] = last; last = x; t = s[i] - 'a' + 1; } printf ("%lld", (sum + last - dp[t] + INF) % INF);//因为最后一次还没更新进去, 所以这里还要用一次更新 } //时间复杂度:O(n)
实现方法2:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define MAXN 200000 #define INF 1000000007 char s[MAXN + 5]; long long dp[26 + 5][2]; int sl[26 + 5]; int main () { int n; scanf ("%s", s + 1); n = strlen (s + 1); for (int i = 1; i <= n; i ++) { long long sum = 1; for (int j = 1; j <= 26; j ++) { if (sl[j] == i - 1) { sum += dp[j][1]; sum %= INF; } else { sum += dp[j][0]; sum %= INF; } } dp[s[i] - 'a' + 1][1] = dp[s[i] - 'a' + 1][0]; dp[s[i] - 'a' + 1][0] = sum; sl[s[i] - 'a' + 1] = i; } long long ans = 0; for (int i = 1; i <= 26; i ++) { ans += dp[i][0]; ans %= INF; } printf ("%lld", ans); } //时间复杂度:O(26n) //因为这份代码又臭又长, 所以大家大可不必管他
这篇关于abc 214G Three Permutations的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)
- 2025-01-03停止思考数据管道,开始构建数据平台:介绍Analytics Engineering Framework
- 2025-01-03如果 Azure-Samples/aks-store-demo 使用了 Score 会怎样?
- 2025-01-03Apache Flink概述:实时数据处理的利器
- 2025-01-01使用 SVN合并操作时,怎么解决冲突的情况?-icode9专业技术文章分享
- 2025-01-01告别Anaconda?试试这些替代品吧
- 2024-12-31自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator
- 2024-12-31自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection