Code Run
C, C++ 빠른 입출력 본문
[GCC 에서 좀더 빠른 입출력 01]
※ 파일 디스크립터( fd - File Descriptor) : 참고 페이지
0 => stdin
1 => stdout
2 => stderr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /** faster IO test https://www.acmicpc.net/problem/10989 comkiwer use GCC unistd.h - read(fd, buffer, nbyte), write(fd, buffer, nbyte) */ #include <cstdio> #include <unistd.h> #include <cstring> const int LM = 10001; const int NBYTE = 2<<20; char number[10] = "00000000\n"; /// 정수를 문자열로 변환하여 저장할 배열 char *np = number+8; /// number배열의 '\n'의 위치 포인터 char bufferIn[NBYTE + 32]; /// 입력 버퍼로 사용할 배열 char *isp = bufferIn + NBYTE; /// 입력 버퍼 시작 포인터, 초기값은 iep. char *iep = isp; /// 입력 버퍼 종료 포인터 char bufferOut[NBYTE + 32]; /// 출력 버퍼로 사용할 배열 char *osp = bufferOut; /// 출력 버퍼 시작 포인터 char *oep = osp + NBYTE; /// 출력 버퍼 종료 포인터 int count[LM]; //inline void bufferSet(){ /// 버퍼 세팅하기 // setvbuf(stdin, bufferIn, _IOFBF, NBYTE + 32); // setvbuf(stdout, bufferOut, _IOFBF, NBYTE + 32); //} inline char get(){ /// 입력 버퍼로 입력받기, 문자단위 반환 /// 입력버퍼가 다 비워졌다면 다시 채우기 if(isp==iep) read(0, isp=bufferIn, NBYTE); return *isp++; /// 현재위치의 문자를 반화하고 포인터 증가 } inline int scan(){ /// 한 개의 정수 단위로 입력받는 함수 register int d = 0, c = get(); /// 첫 문자 입력 /// while(c<48) c = get(); /// 숫자가 아닌 동안 반복 입력 for(;c>47;c = get()) d = d*10 + c - 48; /// 문자열을 정수로 Hornor's method return d; } inline void print(int n, int c){ register char*p = np; for(;n;n/=10) *--p = n%10 + 48; /// 정수를 digit문자로 int len = np - p + 1; /// 변환된 문자열의 길이('\n'포함하여) for(;c--;){ memcpy(osp, p, len); /// 출력 버퍼에 추가하기 osp += len; if(osp>=oep){ /// 출력 버퍼가 가득찼다면 출력하기 write(1, bufferOut, osp-bufferOut); osp = bufferOut; } } } int main(){ //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int N = scan(), i; while(N--) count[scan()]++; for(i=0;i<LM;++i) if(count[i]) print(i, count[i]); write(1, bufferOut, osp-bufferOut); return 0; } | cs |
[C 에서 좀더 빠른 입출력 01]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /** faster IO test comkiwer use stdio.h : size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); */ #include <stdio.h> #include <string.h> const int LM = 10001; const int NBYTE = 2<<20; char number[10] = "00000000\n", *np = number+8; char bufferIn[NBYTE + 32], bufferOut[NBYTE + 32]; char *isp = bufferIn + NBYTE, *iep = isp; char *osp = bufferOut, *oep = osp + NBYTE; int count[LM]; inline char get(){ if(isp==iep) fread(isp=bufferIn, 1, NBYTE, stdin); return *isp++; } inline int scan(){ register int d = 0, c = get(); /// while(c<48) c = get(); for(;c>47;c = get()) d = d*10 + c - 48; return d; } inline void print(int n, int c){ register char*p = np; while(n) *--p = n%10 + 48, n/=10; register int len = np - p + 1; for(;c--;){ memcpy(osp, p, len); osp += len; if(osp>=oep){ fwrite(bufferOut, 1, osp-bufferOut, stdout); osp = bufferOut; } } } int main(){ // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int N = scan(), i; while(N--) count[scan()]++; for(i=0;i<LM;++i) if(count[i]) print(i, count[i]); fwrite(bufferOut, 1, osp-bufferOut, stdout); return 0; } | cs |