1. 程式人生 > >更快的讀入優化

更快的讀入優化

原來的讀優是這樣寫的:

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),可以考慮不用這個讀入優化。