更快的讀入優化
阿新 • • 發佈:2019-02-16
原來的讀優是這樣寫的:
int _read(){
int sum=0;char ch=getchar();
while(!(ch>='0'&&ch<='9'))ch=getchar();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum;
}
- 1
- 2
- 3
- 4
- 5
- 6
可是,遇到資料流大的題目(如4*10^6),如果你的電腦不夠快,還是會超時。
最近請教了Manchery大神,才發現讀優是這樣寫的:
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int _read(){
char ch=nc();int sum=0;
while(!(ch>='0'&&ch<='9'))ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
其中的nc函式就相當於原來的getchar();
這個函式的原理就是先把資料流中的一整段都存下來,然後從這個數組裡讀取,直到陣列讀空了再重新從資料流中讀取,由於是整段整段讀取,所以自然比getchar()要快的多。
=====以下為轉載者新增=====
不過我們會發現,一旦用了這個讀入優化。getchar,scanf都不能用了(存到buf裡了),所有讀入都必須自己寫了。所以說資料流不是太大的時候(如1*10^6),可以考慮不用這個讀入優化。