天天看點

更快的讀入優化

原來的讀優是這樣寫的:

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;
}      

可是,遇到資料流大的題目(如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;
}      

其中的nc函數就相當于原來的getchar();

這個函數的原理就是先把資料流中的一整段都存下來,然後從這個數組裡讀取,直到數組讀空了再重新從資料流中讀取,由于是整段整段讀取,是以自然比getchar()要快的多。

=====以下為轉載者添加=====

不過我們會發現,一旦用了這個讀入優化。getchar,scanf都不能用了(存到buf裡了),所有讀入都必須自己寫了。是以說資料流不是太大的時候(如1*10^6),可以考慮不用這個讀入優化。

se/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>