钾肥喵的窝

我在 CODING 部署的 Hexo 博客

0%

题解 【P1953】 易语言

题面

https://www.luogu.com.cn/problem/P1953

基本思路

很显然就是一个字符串处理的模拟题, 说到字符串, 就想到美国人的算法, 就想到今年下半年, 正则表达式 是一个常用工具, 而 C++ 11 中引入了对正则表达式的支持(在 <regex> 中), 我们可以用正则表达式进行匹配与替换.

原生字符串

这是 C++11 中引入的语法糖, 格式为 R"(A_String)" , A_String 的字面值会被原封不动的保存, 这样我们的正则表达式中就不用每次都用 \\ 来转义了.

regex的使用

出门右拐 CppReference:

https://zh.cppreference.com/w/cpp/header/regex

网络上也有很多介绍, 在此就不赘述了.

注意:

smatchstr() 函数, 参数为 0 时返回的是匹配的整个串.

本题的坑点

不要看到样例就简单的以为首行两个字符串和一个数字和接下来文件名的格式绑定在一起, 下方文件名的格式需要先判断一下, 再处理.

解题

正则表达式

既然我们要用正则来做这题, 怎么写正则表达式就很关键了.

根据题目所述, 我们很自然的想到用字母, 数字以及点来分别匹配文件的主名, 编号, 扩展名.

所以我们就有如下的表达式:

1
2
regex e(R"(([a-zA-Z]{1,})([0-9]{1,})([a-zA-Z\.]{1,}))");//主名 编号 后缀名, abc123.def
regex E(R"(([a-zA-Z]{1,})([a-zA-Z\.]{1,})([0-9]{1,}))");//主名 后缀名 编号, abc.def123

接下来就是语法题了, 请看完整代码.

完整AC代码