- 郑智允 的博客
快读
- 2024-7-25 21:18:18 @
理论上内存会到 100MB。
请使用 C++17 递交。
常数可能会大一点,因为处理了一些特殊情况(防止不负责任的出题老师)。
#define _CRT_SECURE_NO_WARNINGS
#include <cctype>
#include <cstdio>
#include <iostream>
#include <string>
#include <string_view>
#include <type_traits>
// 万能头就行了
using namespace std;
namespace fastIO
{
// 开了 1e8 应该够
char buffer[100'000'000];
char *now = buffer, *end = buffer;
inline void read_all()
{
end = buffer + fread(buffer, 1U, sizeof(buffer), stdin);
if (!feof(stdin)) {
abort(); // 一次读不完就 RE
}
}
// 跳过空白
inline bool skip_space() noexcept
{
while (now != end && isspace(*now)) {
++now;
}
return now != end;
}
// 整数输入,返回 true 代表可以继续输入,返回 false 代表已经读完了
template <typename T, enable_if_t<is_integral_v<T>, int> = 0>
inline bool read(T& value)
{
if (end == buffer) {
read_all();
}
if (skip_space()) {
int sign = 1;
if (*now == '-') {
sign = -1;
value = 0;
} else {
value = *now - '0';
}
++now;
while (now != end && isdigit(*now)) {
value = value * 10 + *(now++) - '0';
}
value *= sign;
return true;
} else {
return false;
}
}
// string 快读,返回值同上
inline bool read(string& value)
{
if (skip_space()) {
value.clear();
char* old_now = now;
while (now != end && !isspace(*now)) {
++now;
}
value.reserve(now - old_now);
while (old_now != now) {
value += *(old_now++);
}
return true;
} else {
return false;
}
}
// 字符数组快读,返回值同上
inline bool read(char* str)
{
if (skip_space()) {
while (now != end && !isspace(*now)) {
*(str++) = *(now++);
}
*str = '\0';
return true;
} else {
return false;
}
}
// 字符快读,返回值同上
inline bool read(char& ch)
{
if (skip_space()) {
ch = *(now++);
return true;
} else {
return false;
}
}
// 可以连着使用,例:read(a, b, c, d);
// a, b, c, d 类型允许不同,返回值同上
template <typename T, typename... Args>
inline bool read(T& value, Args&... args)
{
return read(value) && read(args...);
}
// 数字快输
template <typename T, enable_if_t<is_integral_v<T>, int> = 0>
inline void write(T value)
{
if (value >= 0) {
write<T>(value / 10);
putchar(value % 10); // 这边就不怎么优化了,也不会卡吧
} else {
putchar('-');
write<T>(-value);
}
}
// 包装的 scanf,语法一样,速度未经测试
template <typename... Args>
inline int fast_scanf(const char* format, Args... pointers)
{
if (end == buffer) {
read_all();
}
int status = sscanf(now, format, pointers...);
for (int i = 0; i < status; ++i) {
++now;
while (!isspace(*now)) {
++now;
}
}
return status;
}
// 字符输出 就简单包装了一下
inline void write(char ch)
{
putchar(ch);
}
// 字符数组快输
inline void write(const char* str, int len)
{
fwrite(str, 1U, len, stdout);
}
// string 快输
inline void write(const string_view str)
{
write(str.data(), str.size());
}
// printf 直接调用就好了,没有什么好包装的
} // namespace fastIO
int main() // 例子
{
using namespace fastIO; // main 函数里加这一行
int a;
long long b;
char c;
// read(a, b, c);
fast_scanf("%d", &a);
read(b, c);
int n = 0;
int x;
while (read(x)) {
++n;
}
cout << n << '\n' << a << ' ' << b << '\n' << c << '\n';
return 0;
}
测试:
1 -1000000000000000 ? 3 4 5 7 3 7 4
^Z
7
1 -1000000000000000
?