「QFOI R1」贴贴
题目描述
小 R 是一个可爱的女孩子,她希望通过给洛谷题目写题解的方式跟出题人贴贴。
她发现,如果从题解界面点击“提交题解”按钮,博客中会自动生成 URL 标识符,也就是文章的链接。
其中,标识符的生成规则如下:
- 将题号的所有大写字母转为小写。
- 将上一步结果的所有下划线转为减号。
- 在上一步结果前面加上
solution-
。
她准备给一道题目写题解,已知这道题的题号,你能求出 URL 标识符吗?
输入格式
一行,一个字符串 s s s,表示题号。
输出格式
一行,一个字符串,表示 URL 标识符。
样例 #1
样例输入 #1
P9202
样例输出 #1
solution-p9202
样例 #2
样例输入 #2
CF1797F
样例输出 #2
solution-cf1797f
样例 #3
样例输入 #3
AT_abc312_h
样例输出 #3
solution-at-abc312-h
提示
样例 3 3 3 解释
根据生成规则:
- 将题号的所有大写字母转为小写:
at_abc312_h
。 - 将上一步结果的所有下划线转为减号:
at-abc312-h
。 - 在上一步结果前面加上
solution-
:solution-at-abc312-h
。
数据范围
本题共 10 10 10 个测试点,每个测试点 10 10 10 分。
对于全部数据,保证题号仅包含大写字母(ASCII 65 ∼ 90 65\sim 90 65∼90)、小写字母(ASCII 97 ∼ 122 97\sim 122 97∼122)、数字(ASCII 48 ∼ 57 48\sim 57 48∼57)、下划线(ASCII 95 95 95),且长度不超过 20 20 20。
对于全部数据,答案中应当仅包含小写字母(ASCII 97 ∼ 122 97\sim 122 97∼122)、数字(ASCII 48 ∼ 57 48\sim 57 48∼57)、减号(ASCII 45 45 45)。
- 对于测试点 1 1 1:保证为主题库题目。
- 对于测试点 2 2 2:保证为入门与面试题目。
- 对于测试点 3 ∼ 4 3\sim 4 3∼4:保证为 CodeForces 题目。
- 对于测试点 5 ∼ 6 5\sim 6 5∼6:保证为 SPOJ 题目。
- 对于测试点 7 ∼ 8 7\sim 8 7∼8:保证为 AtCoder 题目。
- 对于测试点 9 ∼ 10 9\sim 10 9∼10:保证为 UVA 题目。
方法1
解题思路:
- 将题号的所有大写字母转为小写。
- 将上一步结果的所有下划线转为减号。
- 在上一步结果前面加上
solution-
。
我们可以按照这个步骤依次处理题号字符串,最终得到 URL 标识符。
C++代码实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;string generateURLIdentifier(string s) {// 将题号的所有大写字母转为小写transform(s.begin(), s.end(), s.begin(), ::tolower);// 将所有下划线转为减号replace(s.begin(), s.end(), '_', '-');// 在结果前面加上 "solution-"s = "solution-" + s;return s;
}int main() {string s;cin >> s;string urlIdentifier = generateURLIdentifier(s);cout << urlIdentifier << endl;return 0;
}
代码解释:
-
定义了一个函数
generateURLIdentifier
,用于根据题号生成 URL 标识符。函数接受一个字符串s
作为参数,表示题号,并返回生成的 URL 标识符。 -
在函数内部,首先使用
transform
函数将题号的所有大写字母转为小写。::tolower
是一个函数指针,指向tolower
函数,用于将大写字母转为小写字母。 -
接下来,使用
replace
函数将所有下划线替换为减号。 -
最后,在结果字符串的前面加上
"solution-"
前缀,得到最终的 URL 标识符。 -
函数返回生成的 URL 标识符。
-
在
main
函数中,首先使用cin
读取题号字符串s
。 -
调用
generateURLIdentifier
函数,将题号字符串s
作为参数传入,得到生成的 URL 标识符,并将其存储在变量urlIdentifier
中。 -
输出
urlIdentifier
,即为生成的 URL 标识符。
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是题号字符串的长度。我们需要遍历题号字符串一次,对每个字符进行转换操作。
- 空间复杂度: O ( n ) O(n) O(n)。我们需要存储题号字符串和生成的 URL 标识符,所需的空间与题号字符串的长度成正比。
这个解决方案利用了C++标准库中的算法函数 transform
和 replace
,可以方便地对字符串进行转换和替换操作。通过按照题目要求的规则依次处理题号字符串,我们可以得到最终的 URL 标识符。
知识点补充
好的,让我详细解释一下 transform
函数,并给出几个使用案例。
transform
函数是C++标准库中的一个算法函数,定义在 <algorithm>
头文件中。它用于对一个范围内的元素进行转换,并将结果存储到另一个范围内。
transform
函数有两种常用的形式:
-
transform(first, last, result, unary_op)
first
和last
是输入范围的迭代器,指定要转换的元素范围。result
是输出范围的迭代器,指定转换结果存储的位置。unary_op
是一个一元函数对象或函数指针,用于对输入范围内的每个元素进行转换操作。
-
transform(first1, last1, first2, result, binary_op)
first1
和last1
是第一个输入范围的迭代器,指定要转换的元素范围。first2
是第二个输入范围的迭代器,指定第二个输入序列的起始位置。result
是输出范围的迭代器,指定转换结果存储的位置。binary_op
是一个二元函数对象或函数指针,用于对两个输入范围内的对应元素进行转换操作。
下面给出几个使用 transform
函数的案例:
案例1:将字符串中的字符转为大写
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int main() {string str = "hello, world!";transform(str.begin(), str.end(), str.begin(), ::toupper);cout << str << endl;return 0;
}
输出结果:
HELLO, WORLD!
在这个案例中,我们使用 transform
函数将字符串 str
中的每个字符转为大写。::toupper
是一个函数指针,指向 toupper
函数,用于将字符转为大写。
案例2:将容器中的元素乘以2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {vector<int> nums = {1, 2, 3, 4, 5};transform(nums.begin(), nums.end(), nums.begin(), [](int x) { return x * 2; });for (int num : nums) {cout << num << " ";}cout << endl;return 0;
}
输出结果:
2 4 6 8 10
在这个案例中,我们使用 transform
函数将容器 nums
中的每个元素乘以2。这里使用了一个匿名函数(lambda表达式)作为转换操作,将每个元素乘以2。
案例3:将两个容器中的对应元素相加
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {vector<int> nums1 = {1, 2, 3};vector<int> nums2 = {4, 5, 6};vector<int> result(3);transform(nums1.begin(), nums1.end(), nums2.begin(), result.begin(), plus<int>());for (int num : result) {cout << num << " ";}cout << endl;return 0;
}
输出结果:
5 7 9
在这个案例中,我们使用 transform
函数将两个容器 nums1
和 nums2
中的对应元素相加,并将结果存储到 result
容器中。plus<int>()
是一个函数对象,用于执行