이 문제는 어려운, 하지만 http://www.aliyun.com/zixun/aggregation/20522.html "> 테스트 데이터 (http://www.ntnu.edu.tw/acm/ProblemSetArchive / b_us_eastcen/1999/index.html) 아주 잔인 한, 있다 테스트 데이터의 여러 1 백만 라인.
아니 2000 밀리초도 처음 알 았 어, 프로그램의 첫 번째 버전의 결과 많은 함수, 전역 변수, 가능한 한 많이 피하와 동적 메모리 할당 및 구조체를 사용 하 여 작성 되었습니다. 나중에 항상 초과 된 발견. 다른 사람들의 답변 온라인 확인, 가정, 더 강한 입력 포맷 발견 다음 완료 메인에 가능한 한 멀리 너무 많은 스타일 원칙을 제어 하지 않습니다. 다른 입력 및 출력 흐름을 사용 하지 않는, 흐름 조금 느린 것 같다.
인터넷 (http://www.cnblogs.com/mobileliker/archive/2013/05/26/3099748.html)에서 더 나은 구조는 가로 막대형 차트의 0-9999999 하기 10 백만의 스파스 배열 NLGN 순서 제거. 메모리 한계는 꽉, 65536 KB,이 배열을 형성 하는 단어는 40 백만 바이트, 약 35000 K 바이트, 그래서 충분 한 메모리가.
이 솔루션에서 다른 장소는 그가 그것을 읽는 방식으로, 그는 읽고는 문자에 단일 문자에 그것을 읽고, 부주의 보이는 하지만 단일 읽기 라인을 저장 하 고 각 문자의 반복 반복. I/O 효율은 키
내 솔루션은 방법, 그리고 그의 솔루션은 또한 처럼, 작성 사실 위에서 배워야 푸시 더 극단적인 상태로이 메서드.
#include "stdio.h"
int _n, _nodup = 0, _idx [10000000];
int _mapint [25] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9};
int main () {
Int _i, _j, _x; 등록
레지스터 int _k;
레지스터 char _c;
scanf ("%d\n" & _n);
대 한
(_i = 0; _i < _n; + + _i) {
_x = 0; _j = 0;
(_j < 7) 동안
{
_c = GetChar ();
경우 (_c > = '0' & & _c < = '9') {
_x _x = * + _c-'0';
+ + _j;
} else if (_c > = 'A' & & _c < = 'Y' & & _c! = 'Q') {
_x _x = * + _mapint [_c-' A '];
+ + _j;
}
}
_idx [_x] + +;
동안
(GetChar ()! = ' \ n ');
}
대 한
(_i _i < 10000000; 0 = + + _i) {
_k = _idx [_i];
경우 (_k > 1) {
printf ("%03d-%04d%d\n", (_i/10000), (_i %10000), _k);
_nodup = 1;
}
}
경우 (_nodup = = 0) printf ("아무 중복. \n");
반환 0;
}
1 편집: 아마도 더 가속 수행할 수 있습니다 나머지 연산자 "%"의 바이패스 출력 부분에.