Skip to content

Instantly share code, notes, and snippets.

@cgiosy
Last active July 9, 2022 04:21
Show Gist options
  • Save cgiosy/97766f45ced4153caab229d6c2be1571 to your computer and use it in GitHub Desktop.
Save cgiosy/97766f45ced4153caab229d6c2be1571 to your computer and use it in GitHub Desktop.
Fast IO
namespace io {
const signed IS=1<<22;
char I[IS+1],*J=I;
inline void daer(){char*p=I;while(*J)*p++=*J++;p[fread(p,1,I+IS-p,stdin)]=0;J=I;}
template<int N=10,typename T=int>inline T getu(){if(J>=I+IS-64)daer();T x=0;int k=0;do x=x*10+(*J-'0');while(*++J>='0'&&++k<N);++J;return x;}
struct f{f(){I[fread(I,1,IS,stdin)]=0;}}flu;
};
using namespace io;
namespace io {
const signed IS=1<<20, OS=1<<18;
char I[IS+1],*J=I,O[OS],*K=O;
inline void daer(){char*p=I;while(*J)*p++=*J++;p[fread(p,1,I+IS-p,stdin)]=0;J=I;}
template<int N=10,typename T=int>inline T getu(){if(J>=I+IS-64)daer();T x=0;int k=0;do x=x*10+(*J-'0');while(*++J>='0'&&++k<N);++J;return x;}
template<int N=10,typename T=int>inline T geti(){bool e=*J=='-';J+=e;return(e?-1:1)*getu<N,T>();}
inline void flush(){fwrite(O,1,K-O,stdout);K=O;}
template<int N=10,char C='\n',typename T>inline void putu(T n){char s[N+7&~7],*p=s;int k=0;do*p++=n%10+48;while((n/=10)&&++k<N);do*K++=*--p;while(p!=s);*K++=C;if(K>=O+OS-64)flush();}
template<int N=10,char C='\n',typename T>inline void puti(T n){if(n<0)*K++='-',n=-n;putu<N,C>(n);}
struct f{f(){I[fread(I,1,IS,stdin)]=0;}~f(){flush();}}flu;
};
using namespace io;
@cgiosy
Copy link
Author

cgiosy commented Oct 8, 2020

함수

  • getu: unsigned형 입력 (음수가 아닌 정수)
  • geti: signed형 입력 (정수)
  • putu: unsigned형 출력 (음수가 아닌 정수)
  • puti: signed형 출력 (정수)
  • daer: 입력을 더 읽어들임
    • 버퍼의 내용을 거의 다 읽어들였을 경우 자동으로 실행됨
  • flush: 버퍼에 쌓인 출력을 flush함.
    • 버퍼 크기가 거의 다 찼을 경우 자동으로 실행됨

사용법

  • int x = getu();: 음수가 아닌 기본 자릿수(10자리) 정수 int형을 입력받음
  • int x = geti<6>();: 6자리 정수 int형을 입력받음
  • char x = getu<3, char>();: 음수가 아닌 3자리 정수 char형을 입력받음 (문자 입력 아님)
  • long long x = geti<14, long long>();: 14자리 정수 long long 형을 입력받음
    • long long은 최대 19자리까지 갈 수 있음
    • 당연하지만 1e9, 10^9은 9자리가 아니라 10자리임
  • 출력도 마찬가지로 putu(x), putu<17, long long>(x) 처럼 하면 됨

기타

  • IS: 입력 버퍼 크기
    • 보통 기본값이면 충분하고 크게 잡아도 1<<24정도면 차고 넘친다
  • OS: 출력 버퍼 크기
    • 위와 마찬가지
    • 보통 출력은 입력보다 작은 경우가 많아서 기본값은 입력보다 약간 더 작게 잡았음
  • template<int N=10,typename T=int>
    • 10 대신 다른 숫자를 써넣으면 기본 자릿수 바뀜
    • int 대신 다른 타입을 써넣으면 기본 타입이 바뀜
  • putu 함수에서 두 번째 템플릿 인자를 ' '로 넣으면 끝에 새 줄 대신 공백을 출력함
  • 문자열 출력은 따로 지원 안 하고 *K++='7'; 처럼 직접 문자를 쓸 수 있긴 함
    • 안전을 위해 50자 이상 쓰면 flush하는 것을 권장
  • 입력이 well-formed에 숫자만 들어온다고 가정함.
    • 만약 공백이 두 개 이상 연속으로 들어오는 경우, getu에서 return 직전의 ++Jwhile(*++J<=' ');로, 딱 두 개까지만 들어오는 경우 J+=*++J<=' ';처럼 고쳐주면 됨

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment