没啥,就贴个板子。 自从我们开始学 OI 以来,我们就接触了 IO。在 zsjz,老师会说: 大家读入数字都用这个:
cin>>n;
输出数字都有这个:
cout<<n;
在 zsyz,老师会说: 大家读入数字都用这个:
scanf("%d",&n);
输出数字都用这个:
printf("%d",n);
效率上,肯定是后面的快,但是前面的如果只加上这一句,就可以和后面达到同样的效果:
ios::sync_with_stdio(false);
但有些时候,两个都不行,于是我们开始学习快读。
inline int read()
{
int s=0;char ch=getchar(),last='0';
while(ch<'0'||ch>'9') last=ch,ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return last=='-'?-s:s;
}
就这么一个板子,背了许多年了。然后发现,那个
s=s*10+ch-'0'
可以写成
s=(s<<1)+(s<<3)+(ch^48)
然后我们居然可以吧 getchar() 直接重定义宏,写成
char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
最后的终极快读就变成了这个样子:
char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
int s=0;
char ch=getchar(),last;
while(ch<'0'||ch>'9') last=ch,ch=getchar();
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return last=='-'?-s:s;
}
然后我所知道的快输自始至终就都是这个样子的:
int num[100];
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;;
int len=0;
do num[len++]=x%10;while(x/=10);
while(len--) putchar(num[len]+'0');
}
上道例题:洛谷 U183572 【模板】快读快写 正解:
#include<bits/stdc++.h>
using namespace std;
char str[60000000];
int main()
{
gets(str);
puts(str);
return 0;
}
呵呵呵
|