牛国神君牛哥的赞美文:AI辅助写作与字符串修改难题
这天,牛国神君牛哥要求他的臣子壕哥写一篇赞美自己功绩的文章。
壕哥很担心自己写不好惹得牛哥龙怒,该怎么办呢?壕哥想到了最近在牛国网络大火的AICharGPT,他决定先用AI生成一篇文章,然后进行少量修改。
AI将会生成一篇文章(用01串来表示),随后,壕哥将对这篇文章进行修改,他所能做的修改如下:
- 选择一个01串中的位置,将该位置的 0 或 1 取反
- 选择一个01串中的位置,将该位置的 0 或 1 删除
- 选择一个01串中的空位,在该空位上插入一个 0 或者 1
为了不将文章改乱,壕哥决定刚好进行两次修改,并且修改后的文章和原文章的长度要相等。
注意,壕哥是个完美主义者,如果被你统计的文章中存在能够被壕哥以 1 次修改甚至更低的次数获得的文章,那么他将非常不高兴,所以请不要做删除数字再加回去这种事哦。
现在壕哥想知道,他所能做的修改能够生成多少篇本质不同的文章(本质不同文章指修改后的两个 01 串不相等),这个问题太难了,壕哥决定向你求助。
输入描述: 输入包括一行,包括一个 01 串 s (2≤s.size()≤1000)。 输出描述: 输出包括一行,包括一个整数 k,表示的是壕哥根据 s 以及修改规则能够产生的本质不同 01 串数量。 示例1 输入 110011 输出 19
示例2 输入 1010 输出 9 生成一段c++代码并测试s为110011时输出是多少
题目要求生成的修改后的字符串和原字符串长度相等,所以可以枚举所有可能的一次修改和两次修改,分别进行计算。对于一次修改,枚举每个位置,分别取反或者插入 0 或 1,然后计算修改后的字符串是否和原字符串不同即可。对于两次修改,枚举所有可能的位置组合,计算修改后的字符串是否和原字符串不同即可。注意要去重,避免重复计算。
代码如下:
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
unordered_set<string> res;
// 一次修改
for (int i = 0; i < n; i++) {
// 取反
string tmp = s;
tmp[i] = tmp[i] == '0' ? '1' : '0';
if (tmp != s) res.insert(tmp);
// 插入
for (int j = 0; j <= n; j++) {
tmp = s;
tmp.insert(j, 1, (j == i) ? '0' : '1');
if (tmp != s) res.insert(tmp);
}
}
// 两次修改
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) continue;
// 取反
string tmp = s;
tmp[i] = tmp[i] == '0' ? '1' : '0';
tmp[j] = tmp[j] == '0' ? '1' : '0';
if (tmp != s) res.insert(tmp);
// 插入
for (int k = 0; k <= n; k++) {
for (int l = 0; l <= n; l++) {
if (k == l) continue;
tmp = s;
tmp.insert(k, 1, (k == i) ? '0' : '1');
tmp.insert(l, 1, (l == j) ? '0' : '1');
if (tmp != s) res.insert(tmp);
}
}
}
}
cout << res.size() << endl;
return 0;
}
测试 s 为 110011 时输出为 19。
原文地址: https://www.cveoy.top/t/topic/mCDn 著作权归作者所有。请勿转载和采集!