这次不放难度了。因为我懒
A. Jabber ID
【题目大意】
一个地址由 <username>@<hostname>[/resource]
组成,其中 [/resource]
可以被省略。
<username>
字段允许大写、小写字母,数字、下划线,其长度应在 \(1\) 到 \(16\) 之间。<hostname>
字段允许用.
来分隔。每一段的要求同<username>
字段,分隔出的每一部分长度在 \(1\) 到 \(16\),<hostname>
字段的总长度在 \(1\) 到 \(32\) 之间。<resource>
字段要求同<username>
字段。
给出一个地址,询问是否合法。
【解题思路】
正则表达式:
分别匹配以下两个正则表达式:
^\w{1,16}@\w{1,16}(\.\w{1,16})*(\/\w{1,16})?$
^\w{1,16}@((\w|\.){1,32})(\/\w{1,16})?$
这里需要两个匹配都成功(事实上,这题数据过水,你只匹配第一个正则表达式也能通过)。
解释:
^
、$
分别表示字符串的开始和结束。\w
表示字母、数字、下划线。{a, b}
表示匹配最少 \(a\) 个字符,最多 \(b\) 个。@
、\.
、\/
分别表示字符@
、.
、/
。后两者加\
是因为.
、/
在正则表达式中有特殊意义。*
表示可以匹配任意次?
表示可以匹配 \(0\) 次或者 \(1\) 次。a|b
表示匹配a
或b
。这里,a
、b
均表示字符串。
注意,在 C++ 中,\
有特殊意义,需要在前面再加一个 \
,变为 \\
。这样,正则表达式变为:
^\\w{1,16}@\\w{1,16}(\\.\\w{1,16})*(\\/\\w{1,16})?$
^\\w{1,16}@((\\w|\\.){1,32})(\\/\\w{1,16})?$
使用方法:
regex()
表示一个正则表达式,()
内填上面的正则表达式。变量类型是regex
。当然,也可以用regex
声明一个正则表达式类型的变量。regex_match(string, regex)
匹配成功返回true
,失败返回false
。string
表示字符串类型,regex
表示正则表达式类型。
示例:
#include <iostream>
#include <regex>
using namespace std;
int main() {
string str = "123456";
regex pattern("\\w");
bool match1 = regex_match(str, pattern);
bool match2 = regex_match(str, regex("\\w*"));
cout << (match1 ? "YES" : "NO") << endl;
cout << (match2 ? "YES" : "NO") << endl;
return 0;
}
输出:
NO
YES
(因为第一个正则表达式 \w
没加表示可以匹配任意次的 *
。)
B. Intersection
【题目大意】
给定两个一次函数 \(A_1 x + B_1 y + C_1 = 0\) 和 \(A_2 x + B_2 y + C_2 = 0\),输出两个一次函数的交点个数,如果有无穷个交点,则输出 -1
。
- 输入的数均为绝对值不超过 \(100\) 的整数。
【解题思路】
两直线平行的条件是 \(\frac{A_1}{B_1} = \frac{A_2}{B_2}\) 且 \(\frac{C_1}{B_1} \neq \frac{C_2}{B_2}\)。
两直线重合的条件是 \(\frac{A_1}{B_1} = \frac{A_2}{B_2}\) 且 \(\frac{C_1}{B_1} = \frac{C_2}{B_2}\)。
前者输出 0
,后者输出 -1
,其他输出 1
。
注意特判 \(B_1 = 0\) 或 \(B_2 = 0\) 的情况。
这题还有 \(A_1 = 0\),\(B_1 = 0\) 或者 \(A_2 = 0\),\(B_2 = 0\) 的情况,也需要特判(也就是说,有可能输入的一次函数表示一个平面或者是空集,不愧是 CF 的出题人,真是良苦用心啊)。
C. Stripe 2
【题目大意】
给出一个长度为 \(n\) 的序列 \(a\),问有多少种方案将序列 \(a\) 划分为恰好连续的三段(每个元素都属于某一段),使得每一段的和都相等。
- \(1 \leq n \leq 10^5\),\(0 \leq \lvert a_i \rvert \leq 10^4\)。
【解题思路】
先对 \(a\) 做前缀和,设前缀和数组为 \(s\)。
如果 \(s_n \bmod 3 \neq 0\),那显然不成立,输出 0
。
否则,如果找到了一个 \(s_i\),使得 \(s_i = \frac{2 \times s_n}{3}\),那么它对答案的贡献是满足 \(s_j = \frac{s_n}{3}\) 的小于 \(i\) 的 \(j\) 的数量。
形式化地,记答案为 \(Ans\),则有
\[Ans = \sum_{i=1}^{n-1} [s_i = \frac{2 \times s_n}{3}] \times \sum_{j=1}^{i-1}[s_j=\frac{s_n}{3}] \]D. Traveling Graph
【题目大意】
给定一个有 \(n\) 个顶点,\(m\) 条边的带边权无向图,要求从顶点 \(1\) 开始经过每一条边至少一次最后回到起点 \(1\) ,要求走过的边权值总和最小。注意:可能有重边和自环。
若无解则输出 -1
。
- \(1 \leq n \leq 15\),\(1 \leq m \leq 2000\)。
【解题思路】
不会,咕了。
标签:regex,frac,16,CF21,题解,leq,CodeForces,正则表达式,匹配 From: https://www.cnblogs.com/Eliauk-FP/p/18565554