[CodeForces] CF21 题解

这次不放难度了。因为我懒

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 表示匹配 ab。这里,ab 均表示字符串。

注意,在 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,失败返回 falsestring 表示字符串类型,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\)

【解题思路】

不会,咕了。

posted @ 2024-11-24 11:00  Eliauk_FP  阅读(26)  评论(1编辑  收藏  举报