题目背景:Codeforces 1328B. K-th Beautiful String(题解)
本题按要求输出第 k 小字典序的字符串,字符串含有 n - 2 个 a 和 2 个 b,长为 n。
调用 n 次 putchar 的输出耗时远远长于先存到内存再直接 puts 输出。
附上测试代码与本机测试结果。
这里用输出到文件代替,是因为直接输出在控制台会导致测试时间过长。
#include<cstdio>
#include<chrono>
#include<algorithm>
using namespace std;
using chrono::steady_clock; using chrono::time_point;
#pragma warning(disable:4996)
const unsigned long long n = 1 << 30; char s[n + 1];
time_point<steady_clock> t0, t1;
int main() {
FILE* f = fopen("o.txt", "w");
_sleep(5000);
for (unsigned long long h = 0; h < 10; ++h) {
_sleep(2000);
printf("Running on test %llu\n", h);
t0 = steady_clock::now();
for (unsigned long long i = 0; i < n; ++i)fputc('a', f);
t1 = steady_clock::now();
printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
t0 = steady_clock::now();
for (unsigned long long i = 0; i < n; ++i)s[i] = 'a';
fputs(s, f);
t1 = steady_clock::now();
printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
t0 = steady_clock::now();
for (auto i = s, ie = s + n; i != ie; ++i)*i = 'a';
fputs(s, f);
t1 = steady_clock::now();
printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
t0 = steady_clock::now();
for (auto i = s, ie = s + n - 1; i <= ie; ++i)*i = 'a';
fputs(s, f);
t1 = steady_clock::now();
printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
putchar('\n');
}
return 0;
}
计算机 1 配置:Core i5-8400 + RTX 2060 + DDR4 2666(2CH)+ 杂牌 PCI-E SSD
VS2019 x64 + Release 模式(-O2)和 GCC 9.2 -m64 -O2 -std=c11 -std=c++1z 的测试结果分别是:
计算机 2 配置:Core i3-8100 + GT 730 亮机卡 + DDR4 2400(2CH)+ WD 1TB 蓝盘(with Intel Optane)
VS2019 x64 + Release 模式(-O2)和 GCC 9.2 -m64 -O2 -std=c11 -std=c++1z 的测试结果分别是: