From e3e95d2956d3e0ff40d8bfa62f6eb1626a2c5451 Mon Sep 17 00:00:00 2001
From: Certseeds <51754303+Certseeds@users.noreply.github.com>
Date: Sat, 19 Sep 2026 04:01:37 +0000
Subject: [PATCH 1/4] docs: update README
Signed-off-by: Certseeds <51754303+Certseeds@users.noreply.github.com>
---
README.md | 31 +++++++++++--------------------
1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/README.md b/README.md
index 6ecee825..c69a857b 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
-
CS203-DSAA-template
+
Algorithm-Template
An awesome Algorithm Template for IO-Driven Single-File Problem(like Online-Judge Problem) !
@@ -66,7 +66,7 @@ OJ系统存在着一些特殊要求-因此考虑到下面的因素, 设计了一
### Built With
-[![Google Test][gtest_image]](https://github.com/google/googletest)
+[Google Test](https://github.com/google/googletest)
(back to top)
@@ -86,7 +86,7 @@ OJ系统存在着一些特殊要求-因此考虑到下面的因素, 设计了一
This is an example of how to list things you need to use the software and how to install them.
-#### Windows
+#### 环境准备
推荐使用 windows subsystem linux 2, 换好apt源之后只需要
@@ -137,14 +137,14 @@ git clone https://github.com/${YOUE_GITHUB_USER_NAME}/algorithm-template.git
## Usage: 执行代码和测试
-使用clion打开文件夹, 配置好C++环境的基础上, 会自动识别`CmakeList.txt`.
+使用clion打开文件夹, 配置好C++环境的基础上, 会自动识别 `CmakeList.txt`
-产生`CS203_lab${order}_${ques_Order}`, `CS203_lab${order}_${ques_Order}_test` 形式的复数个可以运行的可选项.
+产生`ALGORITHM_lab${order}_${ques_Order}`, `ALGORITHM_lab${order}_${ques_Order}_test` 形式的复数个可以运行的可选项.
`lab${order}_${ques_Order}`为对应题号, 比如`lab07_01`对应lab_07的C1题.
-+ `CS203_lab07_01`将调用`lab_07\lab_07_C1\main.cpp`, 为将要提交的源文件.
-+ `CS203_lab07_01_test`将调用`lab_07\lab_07_C1\test.cpp`, 对其进行测试.
++ `ALGORITHM_lab07_01`将调用`lab_07\lab_07_C1\main.cpp`, 为将要提交的源文件.
++ `ALGORITHM_lab07_01_test`将调用`lab_07\lab_07_C1\test.cpp`, 对其进行测试.
+ `lab_*\lab_*_*\test.cpp`目的为方便测试, 同时便于分享测试用例.
(back to top)
@@ -186,7 +186,7 @@ PS: 当然, 这种情况也只适用于规模比较小的情况, 规模再大的
比如[判断二分图](./lab_00/C/main.cpp), 一张图可以有几十上百个node, 写在内部占用空间太大.
-而在这里, 使用`CS203_redirect`对象, 便可以省去手动输入的方式.
+而在这里, 使用`ALGORITHM_redirect`对象, 便可以省去手动输入的方式.
``` cpp
TEST(lab_00_C, test_case_1) {
@@ -238,13 +238,7 @@ PS: 至于比较文件之间的差异, 可以使用内置的`compareFiles(string
### 为什么要选择C++做题?
-1. C++是dalao们的选择
-直接去
-[dalao1](https://acm.sustech.edu.cn/onlinejudge/status.php?user_id=11710724&jresult=4)
-[dalao2](https://acm.sustech.edu.cn/onlinejudge/status.php?user_id=11612908&jresult=4)
-[dalao3](https://acm.sustech.edu.cn/onlinejudge/status.php?user_id=11712510&jresult=4)
-等等dalao的解题页面看看, 会发现在排行榜榜首的人, 绝大多数题目使用的都是C++.
-
+1. C++ 参考用例更多, 相关资源更丰富
2. 速度.
+ oj内一般java的最大运行时间都会是c++的2倍, 显然是暗示速度之间的差别.
@@ -252,16 +246,12 @@ PS: 至于比较文件之间的差异, 可以使用内置的`compareFiles(string
3. 对数据结构的友好性
-DSAA既然内含Data structure, 就势必涉及到类似Node, Tree, Graph等等数据结构, 这类数据结构使用C++写, 比较方便理解.
+涉及到类似Node, Tree, Graph等等数据结构, 这类数据结构使用C++写, 比较方便理解.
4. 对算法友好的性能:
之前写树和图相关的题目时, 最头疼的就是Java的爆栈, 有一段时间只要用递归就爆栈, 相同算法修改为C++之后问题就消失了.
-5. 相关资源的丰富程度
-
-不管怎么说, c++是dalao的选择, 所以在网络上搜索题目, 得到的大多数答案都是C/C++, java的数量很少.
-
### 如何手动开优化
1. 将[magic_optimize](./include/magic_macro/magic_macro.hpp)内的内容粘贴到代码最上方.
@@ -339,6 +329,7 @@ Don't forget to give the project a star! Thanks again!
+ 由于本仓库设计只包括"上交"源码这一种场景, 因此实际上不存在二进制分发以及被云服务使用这种场景.
+ 具体内容请看[`LICENSE_AGPL_V3_0.md`](./LICENSE_AGPL_V3_0.md)
+
some code is based on this license
### CC-BY-NC-SA-4.0+ LICENSE
From a25dda8e1e98496ab15700d4c5613741848d295e Mon Sep 17 00:00:00 2001
From: Certseeds <51754303+Certseeds@users.noreply.github.com>
Date: Sat, 19 Sep 2026 04:48:45 +0000
Subject: [PATCH 2/4] docs: update README
Signed-off-by: Certseeds <51754303+Certseeds@users.noreply.github.com>
---
README.md | 136 +++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 108 insertions(+), 28 deletions(-)
diff --git a/README.md b/README.md
index c69a857b..cf8983e8 100644
--- a/README.md
+++ b/README.md
@@ -17,9 +17,9 @@
An awesome Algorithm Template for IO-Driven Single-File Problem(like Online-Judge Problem) !
- 分布式1 去中心化2 的IO驱动型单文件问题4解题模板
+ 分布式1 去中心化2 的IO驱动型单文件问题3解题模板
- Explore the docs »
+ Explore the docs »
View Demo
@@ -44,29 +44,41 @@
-
Usage
+
+ Usage
+
+
+
Test Introduce
+
Details
Roadmap
Contributing
License
Contact
Acknowledgments
+
Thanks
## About The Project
-OJ系统存在着一些特殊要求-因此考虑到下面的因素, 设计了一套代码模板, 以适应OJ系统的独特环境.
+OJ系统存在着一些特殊要求, 因此考虑到下面的因素, 设计了一套代码模板, 以适应OJ系统的独特环境.
+ 上交题目无需修改类名, 方法名等等内容, 只需复制粘贴.
-+ 支持为每个问题撰写测试用例, 并支持用户之间方便的交换测试用例
-+ 只依赖于Unix-Like系统, 支持C++20的编译器与仓库本身, 没有依赖包
-+ 易于拓展, 提供基本算法接口与实现
++ 支持为每个问题撰写测试用例, 并支持用户之间方便的交换测试用例.
++ 只依赖 Unix-Like 系统与一个支持 C++20 的编译器, 外部依赖仅有 Google Test.
++ 易于拓展, 提供基本算法接口与实现.
### Built With
-[Google Test](https://github.com/google/googletest)
++ 语言: [C++](https://isocpp.org/) — 提交用源码按 C++11 编译, 测试按 C++20 编译, 因此需要支持 C++20 的编译器.
++ 构建: [CMake](https://cmake.org/) (>= 3.16.6) 与 [ccache](https://ccache.dev/).
++ 测试: [Google Test](https://github.com/google/googletest) / [Google Mock](https://github.com/google/googletest).
++ 可选: [Podman](https://podman.io/) 容器开发环境, 见 [script/container.sh](./script/container.sh).
(back to top)
@@ -84,8 +96,6 @@ OJ系统存在着一些特殊要求-因此考虑到下面的因素, 设计了一
### Prerequisites
-This is an example of how to list things you need to use the software and how to install them.
-
#### 环境准备
推荐使用 windows subsystem linux 2, 换好apt源之后只需要
@@ -133,19 +143,62 @@ git clone https://github.com/${YOUE_GITHUB_USER_NAME}/algorithm-template.git
使用命令行, 进入`./script`下, 编辑`file_template`的`labs` & `problem_orders`,
`python3 ./file_template.py`, 出现`produce files finish`提示, 即为创建成功.
+### Project Structure
+
+``` text
+.
+├── CMakeLists.txt # 顶层构建入口, 自动发现 lab_* 目录
+├── cmake/ # 构建配置: 编译类型 / 跨平台 / 并行 / ccache / policy
+├── include/ # 公共头文件, 以 Interface Library 提供给各题目
+│ ├── gtest_main.hpp # 测试入口, 引入 gtest/gmock 与 public.hpp
+│ ├── include/ # CS203_redirect / CS203_sequence / CS203_timer 等工具
+│ ├── class_helper/ # nonable 等基类
+│ ├── list/ tree/ # 链表 / 树 / Trie 等数据结构
+│ └── magic_macro/ # 手动开优化用的宏
+├── lab_00/ # 一个 lab, 内含若干题目
+│ ├── CMakeLists.txt # 声明本 lab 下的题目列表
+│ └── A/ # 一道题目
+│ ├── main.cpp # 将要提交的源文件, 含 read()/处理函数/output()
+│ └── test.cpp # Google Test 测试
+├── script/ # 模板生成 / 一键构建 / 容器脚本
+└── .github/workflows/ # CI(提交触发) 与 CD(Tag 触发 Release)
+```
+
++ `include/` 通过 CMake Interface Library 暴露, 各题目用 `target_link_libraries` 链接.
++ `lab_*/` 由顶层 CMake 用 `file(GLOB ...)` 自动发现, 新增 lab 后重新 configure 即可.
+
(back to top)
-## Usage: 执行代码和测试
+## Usage
-使用clion打开文件夹, 配置好C++环境的基础上, 会自动识别 `CmakeList.txt`
+执行代码和测试:
+
+### 在 CLion 中
+
+使用 CLion 打开文件夹, 配置好 C++ 环境后会自动识别 `CMakeLists.txt`, 并生成若干可运行项:
+
++ `ALGORITHM_lab_00_A`: 调用 `lab_00/A/main.cpp`, 即将要提交的源文件.
++ `ALGORITHM_lab_00_A_test`: 调用 `lab_00/A/test.cpp`, 对其进行测试.
+
+可运行项命名规则为 `ALGORITHM_lab_{lab 编号}_{题号}`, 其中 lab 编号为两位数字、题号为字母, 例如 `ALGORITHM_lab_00_A` 对应 `lab_00` 的 A 题.
+
+### Command Line Build
+
+仓库提供 [`script/test.sh`](./script/test.sh), 在仓库根目录执行即可完成配置、编译与 `ctest`.
+
+``` bash
+bash script/test.sh
+```
-产生`ALGORITHM_lab${order}_${ques_Order}`, `ALGORITHM_lab${order}_${ques_Order}_test` 形式的复数个可以运行的可选项.
+脚本会在临时目录中基于 CMake 构建并运行全部测试, 结束后自动清理. 也可手动执行:
-`lab${order}_${ques_Order}`为对应题号, 比如`lab07_01`对应lab_07的C1题.
+``` bash
+cmake -S . -B cmake-build-debug -DCMAKE_BUILD_TYPE=Debug
+cmake --build cmake-build-debug --parallel "$(nproc)"
+cd cmake-build-debug && ctest --output-on-failure
+```
-+ `ALGORITHM_lab07_01`将调用`lab_07\lab_07_C1\main.cpp`, 为将要提交的源文件.
-+ `ALGORITHM_lab07_01_test`将调用`lab_07\lab_07_C1\test.cpp`, 对其进行测试.
-+ `lab_*\lab_*_*\test.cpp`目的为方便测试, 同时便于分享测试用例.
+> 若需要在容器内开发, 可使用 [`script/container.sh`](./script/container.sh) 启动预配置好的镜像.
(back to top)
@@ -158,6 +211,30 @@ git clone https://github.com/${YOUE_GITHUB_USER_NAME}/algorithm-template.git
3. 可以互相分享少量代码而不触及核心逻辑, 方便协作.
4. 便于使用测试.
+### 约定: `read()` / 处理函数 / `output()`
+
+每道题的 `main.cpp` 按同一套签名组织, 使读取、处理、输出彼此独立:
+
+``` cpp
+using input_type = ...; // 输入数据的类型
+using output_type = ...; // 输出数据的类型
+
+input_type read(); // 从 cin 读入
+output_type solve(const input_type &); // 处理函数, 名称随题目而定
+void output(const output_type &); // 写到 cout
+
+int main() {
+ const auto input_data = read();
+ const auto output_data = solve(input_data);
+ output(output_data);
+ return 0;
+}
+```
+
++ 处理函数名随题目而定 (如 `isBipartite`), 但签名约定一致, 便于测试直接调用.
++ `test.cpp` 通过 `#include "main.cpp"` 复用这些函数, 并用 `CS203_redirect` 重定向 IO.
++ 每个 `test.cpp` 需实现 `getFilePath()` 并据此定义 `CS203_redirect::file_paths`, 详见下文重定向部分.
+
### 基本测试用例展示 A+B: lab_00_A , 测试样例
+ 这个问题较为简单, 见[A+B](./lab_00/A/main.cpp) 解决起来不复杂.
@@ -168,7 +245,7 @@ git clone https://github.com/${YOUE_GITHUB_USER_NAME}/algorithm-template.git
+ 在本repo, 使用 `Google Test` 测试框架.
+ 比如, 我们有四组数据, 第一组, 第二组测试边界值, 第三组使用随机数测试对偶性与正确性, 第四组测试几个手动的随机值.
+ 参见[test_for_lab00_A](./lab_00/A/test.cpp)
-+ 这样一来, 我们只需要每次修改完主文件之后, run `algorithm-template_test`, 对其进行调用, 就能验证其在所有的测试用例上的正确性.
++ 这样一来, 我们只需要每次修改完主文件之后, run `ALGORITHM_lab_00_A_test`, 对其进行调用, 就能验证其在所有的测试用例上的正确性.
### 多个输出值的检查: `EXPECT_EQ`
@@ -186,7 +263,7 @@ PS: 当然, 这种情况也只适用于规模比较小的情况, 规模再大的
比如[判断二分图](./lab_00/C/main.cpp), 一张图可以有几十上百个node, 写在内部占用空间太大.
-而在这里, 使用`ALGORITHM_redirect`对象, 便可以省去手动输入的方式.
+而在这里, 使用`CS203_redirect`对象, 便可以省去手动输入的方式.
``` cpp
TEST(lab_00_C, test_case_1) {
@@ -206,11 +283,16 @@ TEST(lab_00_C, test_case_1) {
+ test case with tuple 则最优雅, 修改起来的难度最小.
+ test case with sequence 比tuple更优雅, 输入, 输出全为自动产生.
-PS: 此处注意, 引用文件的相对路径, 不是直接的`test/lab_00/C/resource/01.data.in`,
+PS: 此处注意, `01.data.in` 这类路径是相对于**编译产物所在目录**解析的, 而非相对于 `test.cpp`.
+
+每个 `test.cpp` 中的 `getFilePath()` 返回资源目录相对编译产物目录的路径, 例如 [lab_00/C/test.cpp](./lab_00/C/test.cpp):
-而是编译出的文件相对于测试数据的相对路径.
+``` cpp
+std::string getFilePath() noexcept { return "./../../../lab_00/C/resource/"; }
+const std::string CS203_redirect::file_paths = getFilePath();
+```
-在样例中, 编译出的文件在`algorithm-template/cmake-build-debug`下, 所以需要加`./../`
+以 `cmake-build-debug` 为例, 测试产物位于 `cmake-build-debug/lab_00/C/` 下, 因此需要 `./../../../` 回到仓库根目录, 再拼接 `lab_00/C/resource/`. 换用其它构建目录时, 相对层级可能不同, 需相应调整 `getFilePath()`.
### 输入输出重定向-Stage 2: 从文件中读取输入, 将输出定向到文件中
@@ -271,7 +353,7 @@ static const auto faster_streams = [] {
}();
```
-已放置在源文件最下方, 注意**不要混用**C风格输入输出(`scanf`, `printf`)与c++风格输入输出(`cin`, `cout`)
+关闭同步的代码已放在每道题 `main.cpp` 的最下方, 注意**不要混用**C风格输入输出(`scanf`, `printf`)与c++风格输入输出(`cin`, `cout`)
通常情况下, 可以将运行时间缩短到1/2甚至更少.
@@ -293,11 +375,9 @@ yes | sudo apt-get install libgtest-dev libgmock-dev
+ [x] CI-CD
+ [x] CI: GitHub-Actions提交触发
+ [x] CD: Tag触发的自动Release
-+ [x] ~~leetcode题目~~
-+ [x] ~~预编译头文件~~ccache加速编译
-+ [x] ~~basic文件夹添加CS205内容, 方便入门C++~~
- + [x] ~~以及一部分rust代码~~
-+ [ ] ~~Cyaron测试数据生成~~
++ [x] 某一学期的完整题目 (见 [2021fall 分支](https://github.com/Certseeds/algorithm-template/tree/2021fall))
++ [x] ccache 加速编译
++ [ ] ~~Cyaron 测试数据生成~~
+ [ ] ~~WiKi Page~~
(back to top)
From b2079cb455e0809886f713e72dbf863b9fae7108 Mon Sep 17 00:00:00 2001
From: Certseeds <51754303+Certseeds@users.noreply.github.com>
Date: Sat, 19 Sep 2026 05:00:00 +0000
Subject: [PATCH 3/4] feat: using CalVer
Signed-off-by: Certseeds <51754303+Certseeds@users.noreply.github.com>
---
CMakeLists.txt | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b4a1e534..e9f73f57 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,11 @@
cmake_minimum_required(VERSION 3.16.6)
-set(PROJECT_VERSION_MAJOR 0)
-set(PROJECT_VERSION_MINOR 16)
-set(PROJECT_VERSION_PATCH 1) # delete endsWith strs when master merge dev
+set(PROJECT_VERSION_MAJOR 2026)
+set(PROJECT_VERSION_MINOR 09)
+set(PROJECT_VERSION_PATCH 19)
project(algorithm_template
+ VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}
DESCRIPTION "Template for Algorithm Based on C++11 and Modern CMake"
HOMEPAGE_URL "https://github.com/Certseeds/algorithm-template"
LANGUAGES CXX)
From 7eef4dec55ad9cfcd985e93d9a42d32568580680 Mon Sep 17 00:00:00 2001
From: Certseeds <51754303+Certseeds@users.noreply.github.com>
Date: Sat, 19 Sep 2026 05:00:49 +0000
Subject: [PATCH 4/4] docs: update system require
Signed-off-by: Certseeds <51754303+Certseeds@users.noreply.github.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index cf8983e8..f870647e 100644
--- a/README.md
+++ b/README.md
@@ -98,7 +98,7 @@ OJ系统存在着一些特殊要求, 因此考虑到下面的因素, 设计了
#### 环境准备
-推荐使用 windows subsystem linux 2, 换好apt源之后只需要
+推荐使用 windows subsystem linux 2 Ubuntu-26.04, 换好 apt 源之后只需要
``` bash
yes | sudo apt-get update