我的读入挂:
namespace FastIO {
const int SIZE =
1 <<
16;
char buf[SIZE], str[
64];
int l = SIZE, r = SIZE;
int read(
char *s) {
while (r) {
for (; l < r && buf[l] <=
' '; l++);
if (l < r)
break;
l =
0, r =
int(fread(buf,
1, SIZE, stdin));
}
int cur =
0;
while (r) {
for (; l < r && buf[l] >
' '; l++) s[cur++] = buf[l];
if (l < r)
break;
l =
0, r =
int(fread(buf,
1, SIZE, stdin));
}
s[cur] =
'\0';
return cur;
}
template<
typename type>
bool read(type &x,
int len =
0,
int cur =
0,
bool flag =
false) {
if (!(len = read(str)))
return false;
if (str[cur] ==
'-') flag =
true, cur++;
for (x =
0; cur < len; cur++) x = x *
10 + str[cur] -
'0';
if (flag) x = -x;
return true;
}
template <
typename type>
type read(
int len =
0,
int cur =
0,
bool flag =
false, type x =
0) {
if (!(len = read(str)))
return false;
if (str[cur] ==
'-') flag =
true, cur++;
for (x =
0; cur < len; cur++) x = x *
10 + str[cur] -
'0';
return flag ? -x : x;
}
}
using FastIO::read;
int main() {
char str[
107];
read(str);
printf(
"read(char *): %s\n", str);
int n = read<
int>();
printf(
"read<int>() = %d\n", n);
read(n);
printf(
"read(n), n = %d\n", n);
long long m = read<
long long>();
printf(
"read<long long>() = %lld\n", m);
read(m);
printf(
"read(m), m = %lld\n", m);
while (read(n))
printf(
"%d\n", n);
return 0;
}
Fread读入挂会不断的将控制台的内容读入缓存,直到读入末尾EOF才会停止读入,故常规情况无法测试,推荐使用freopen。
qscqesze大佬的读入挂:
http://www.cnblogs.com/qscqesze/p/5736748.html
fread读入挂:
const int BUF=
40000000;
char Buf[BUF],*buf=Buf;
const int OUT=
20000000;
char Out[OUT],*ou=Out;
int Outn[
30],Outcnt;
inline void write(
int x){
if(!x)*ou++=
48;
else{
for(Outcnt=
0;x;x/=
10)Outn[++Outcnt]=x%
10+
48;
while(Outcnt)*ou++=Outn[Outcnt--];
}
}
inline void writell(ll x){
if(!x)*ou++=
48;
else{
for(Outcnt=
0;x;x/=
10)Outn[++Outcnt]=x%
10+
48;
while(Outcnt)*ou++=Outn[Outcnt--];
}
}
inline void writechar(
char x){*ou++=x;}
inline void writeln(){*ou++=
'\n';}
inline void read(
int&a){
for(a=
0;*buf<
48;buf++);
while(*buf>
47)a=a*
10+*buf++-
48;}
fread(Buf,
1,BUF,stdin);
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int BUF=
40000000;
char Buf[BUF],*buf=Buf;
const int OUT=
20000000;
char Out[OUT],*ou=Out;
int Outn[
30],Outcnt;
inline void write(
int x){
if(!x)*ou++=
48;
else{
for(Outcnt=
0;x;x/=
10)Outn[++Outcnt]=x%
10+
48;
while(Outcnt)*ou++=Outn[Outcnt--];
}
}
inline void writell(ll x){
if(!x)*ou++=
48;
else{
for(Outcnt=
0;x;x/=
10)Outn[++Outcnt]=x%
10+
48;
while(Outcnt)*ou++=Outn[Outcnt--];
}
}
inline void writechar(
char x){*ou++=x;}
inline void writeln(){*ou++=
'\n';}
inline void read(
int&a){
for(a=
0;*buf<
48;buf++);
while(*buf>
47)a=a*
10+*buf++-
48;}
int main(){
fread(Buf,
1,BUF,stdin);
int a,b;
read(a),read(b);
write(a+b);
writeln();
fwrite(Out,
1,ou-Out,stdout);
}
一般读入挂:
inline ll read()
{
int x=
0,f=
1;
char ch=getchar();
while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=getchar();}
while(ch>=
'0'&&ch<=
'9'){x=x*
10+ch-
'0';ch=getchar();}
return x*f;
}
超神读入挂:
namespace fastIO{
#define BUF_SIZE 100000
#define OUT_SIZE 100000
#define ll long long
bool IOerror=
0;
inline char nc(){
static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
if (p1==pend){
p1=buf; pend=buf+fread(buf,
1,BUF_SIZE,stdin);
if (pend==p1){IOerror=
1;
return -
1;}
}
return *p1++;
}
inline bool blank(
char ch){
return ch==
' '||ch==
'\n'||ch==
'\r'||ch==
'\t';}
inline void read(
int &x){
bool sign=
0;
char ch=nc(); x=
0;
for (;blank(ch);ch=nc());
if (IOerror)
return;
if (ch==
'-')sign=
1,ch=nc();
for (;ch>=
'0'&&ch<=
'9';ch=nc())x=x*
10+ch-
'0';
if (sign)x=-x;
}
inline void read(ll &x){
bool sign=
0;
char ch=nc(); x=
0;
for (;blank(ch);ch=nc());
if (IOerror)
return;
if (ch==
'-')sign=
1,ch=nc();
for (;ch>=
'0'&&ch<=
'9';ch=nc())x=x*
10+ch-
'0';
if (sign)x=-x;
}
inline void read(
double &x){
bool sign=
0;
char ch=nc(); x=
0;
for (;blank(ch);ch=nc());
if (IOerror)
return;
if (ch==
'-')sign=
1,ch=nc();
for (;ch>=
'0'&&ch<=
'9';ch=nc())x=x*
10+ch-
'0';
if (ch==
'.'){
double tmp=
1; ch=nc();
for (;ch>=
'0'&&ch<=
'9';ch=nc())tmp/=
10.0,x+=tmp*(ch-
'0');
}
if (sign)x=-x;
}
inline void read(
char *s){
char ch=nc();
for (;blank(ch);ch=nc());
if (IOerror)
return;
for (;!blank(ch)&&!IOerror;ch=nc())*s++=ch;
*s=
0;
}
inline void read(
char &c){
for (c=nc();blank(c);c=nc());
if (IOerror){c=-
1;
return;}
}
inline void read1(
int &x){
char ch;
int bo=
0;x=
0;
for (ch=getchar();ch<
'0'||ch>
'9';ch=getchar())
if (ch==
'-')bo=
1;
for (;ch>=
'0'&&ch<=
'9';x=x*
10+ch-
'0',ch=getchar());
if (bo)x=-x;
}
inline void read1(ll &x){
char ch;
int bo=
0;x=
0;
for (ch=getchar();ch<
'0'||ch>
'9';ch=getchar())
if (ch==
'-')bo=
1;
for (;ch>=
'0'&&ch<=
'9';x=x*
10+ch-
'0',ch=getchar());
if (bo)x=-x;
}
inline void read1(
double &x){
char ch;
int bo=
0;x=
0;
for (ch=getchar();ch<
'0'||ch>
'9';ch=getchar())
if (ch==
'-')bo=
1;
for (;ch>=
'0'&&ch<=
'9';x=x*
10+ch-
'0',ch=getchar());
if (ch==
'.'){
double tmp=
1;
for (ch=getchar();ch>=
'0'&&ch<=
'9';tmp/=
10.0,x+=tmp*(ch-
'0'),ch=getchar());
}
if (bo)x=-x;
}
inline void read1(
char *s){
char ch=getchar();
for (;blank(ch);ch=getchar());
for (;!blank(ch);ch=getchar())*s++=ch;
*s=
0;
}
inline void read1(
char &c){
for (c=getchar();blank(c);c=getchar());}
inline void read2(
int &x){
scanf(
"%d",&x);}
inline void read2(ll &x){
#ifdef _WIN32
scanf(
"%I64d",&x);
#else
#ifdef __linux
scanf(
"%lld",&x);
#else
puts(
"error:can't recognize the system!");
#endif
#endif
}
inline void read2(
double &x){
scanf(
"%lf",&x);}
inline void read2(
char *s){
scanf(
"%s",s);}
inline void read2(
char &c){
scanf(
" %c",&c);}
inline void readln2(
char *s){gets(s);}
struct Ostream_fwrite{
char *buf,*p1,*pend;
Ostream_fwrite(){buf=
new char[BUF_SIZE];p1=buf;pend=buf+BUF_SIZE;}
void out(
char ch){
if (p1==pend){
fwrite(buf,
1,BUF_SIZE,stdout);p1=buf;
}
*p1++=ch;
}
void print(
int x){
static char s[
15],*s1;s1=s;
if (!x)*s1++=
'0';
if (x<
0)out(
'-'),x=-x;
while(x)*s1++=x%
10+
'0',x/=
10;
while(s1--!=s)out(*s1);
}
void println(
int x){
static char s[
15],*s1;s1=s;
if (!x)*s1++=
'0';
if (x<
0)out(
'-'),x=-x;
while(x)*s1++=x%
10+
'0',x/=
10;
while(s1--!=s)out(*s1); out(
'\n');
}
void print(ll x){
static char s[
25],*s1;s1=s;
if (!x)*s1++=
'0';
if (x<
0)out(
'-'),x=-x;
while(x)*s1++=x%
10+
'0',x/=
10;
while(s1--!=s)out(*s1);
}
void println(ll x){
static char s[
25],*s1;s1=s;
if (!x)*s1++=
'0';
if (x<
0)out(
'-'),x=-x;
while(x)*s1++=x%
10+
'0',x/=
10;
while(s1--!=s)out(*s1); out(
'\n');
}
void print(
double x,
int y){
static ll mul[]={
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000LL,
100000000000LL,
1000000000000LL,
10000000000000LL,
100000000000000LL,
1000000000000000LL,
10000000000000000LL,
100000000000000000LL};
if (x<-
1e-12)out(
'-'),x=-x;x*=mul[y];
ll x1=(ll)
floor(x);
if (x-
floor(x)>=
0.5)++x1;
ll x2=x1/mul[y],x3=x1-x2*mul[y]; print(x2);
if (y>
0){out(
'.');
for (size_t i=
1;i<y&&x3*mul[i]<mul[y];out(
'0'),++i); print(x3);}
}
void println(
double x,
int y){print(x,y);out(
'\n');}
void print(
char *s){
while (*s)out(*s++);}
void println(
char *s){
while (*s)out(*s++);out(
'\n');}
void flush(){
if (p1!=buf){fwrite(buf,
1,p1-buf,stdout);p1=buf;}}
~Ostream_fwrite(){flush();}
}Ostream;
inline void print(
int x){Ostream.print(x);}
inline void println(
int x){Ostream.println(x);}
inline void print(
char x){Ostream.out(x);}
inline void println(
char x){Ostream.out(x);Ostream.out(
'\n');}
inline void print(ll x){Ostream.print(x);}
inline void println(ll x){Ostream.println(x);}
inline void print(
double x,
int y){Ostream.print(x,y);}
inline void println(
double x,
int y){Ostream.println(x,y);}
inline void print(
char *s){Ostream.print(s);}
inline void println(
char *s){Ostream.println(s);}
inline void println(){Ostream.out(
'\n');}
inline void flush(){Ostream.flush();}
char Out[OUT_SIZE],*o=Out;
inline void print1(
int x){
static char buf[
15];
char *p1=buf;
if (!x)*p1++=
'0';
if (x<
0)*o++=
'-',x=-x;
while(x)*p1++=x%
10+
'0',x/=
10;
while(p1--!=buf)*o++=*p1;
}
inline void println1(
int x){print1(x);*o++=
'\n';}
inline void print1(ll x){
static char buf[
25];
char *p1=buf;
if (!x)*p1++=
'0';
if (x<
0)*o++=
'-',x=-x;
while(x)*p1++=x%
10+
'0',x/=
10;
while(p1--!=buf)*o++=*p1;
}
inline void println1(ll x){print1(x);*o++=
'\n';}
inline void print1(
char c){*o++=c;}
inline void println1(
char c){*o++=c;*o++=
'\n';}
inline void print1(
char *s){
while (*s)*o++=*s++;}
inline void println1(
char *s){print1(s);*o++=
'\n';}
inline void println1(){*o++=
'\n';}
inline void flush1(){
if (o!=Out){
if (*(o-
1)==
'\n')*--o=
0;
puts(Out);}}
struct puts_write{
~puts_write(){flush1();}
}_puts;
inline void print2(
int x){
printf(
"%d",x);}
inline void println2(
int x){
printf(
"%d\n",x);}
inline void print2(
char x){
printf(
"%c",x);}
inline void println2(
char x){
printf(
"%c\n",x);}
inline void print2(ll x){
#ifdef _WIN32
printf(
"%I64d",x);
#else
#ifdef __linux
printf(
"%lld",x);
#else
puts(
"error:can't recognize the system!");
#endif
#endif
}
inline void println2(ll x){print2(x);
printf(
"\n");}
inline void println2(){
printf(
"\n");}
#undef ll
#undef OUT_SIZE
#undef BUF_SIZE
};
using namespace fastIO;
注意
举个例子,现在有一个表达式,addedge(u,v);,一定要老老实实的写成这种形式:
#define read read()
int u = read, v = read;
addedge(u,v);
不能追求简洁写成这种形式:
#define read read()
addedge(read, read);
虽然本地编译器跑起来没问题,但是有些OJ会WA,比如说POJ,POJ,和POJ。
注意
一般情况下相比scanf来说,只有当读入量达到
105
10
5
才会有明显作用。虽然读入挂看起来很厉害,有时候能过掉一些卡常数的题,但还是推荐小伙伴们追求正解。