몇 가지 최적화 : 당신이 일반적으로 훨씬 더 빨리, 곱셈에 대한 모듈을 거래 할 수
: q= a/10; m= a - 10 * q;
당신이 모든 플래그를 포장하여 최종 계산 루프를 방지 할 수 있습니다 단일 정수, let mask
; mask= 0
으로 초기화하십시오. 숫자 (m
)를 찾을 때마다 mask|= (1 << m)
으로 플래그를 지정하십시오. 결국 카운트는 bits[mask]
에 의해 주어지며, 여기서 bits
은 0
에서 1023=2^10-1
까지의 모든 정수에 대한 사전 계산 된 카운트를 포함하는 벡터입니다.
int distinct(long long int a)
{
int mask= 0;
while (a)
{
int q= a/10, m= a - 10 * q;
mask|= 1 << m;
a= q;
}
static short bits[1024]= { 0, 1, 1, 2, 1, 2, 2, 3, ...}; // Number of bits set
return bits[mask];
}
더 나은, 당신이 그룹에서 숫자로 작업 할 수 있습니다, 세 가지의 말한다. 기본 10으로 변환하는 대신 기본 1000으로 변환하십시오. 그리고 모든 기본 1000 "숫자"에 대해 구성 십진수를 플래그하는 해당 마스크를 계산하십시오 (예 :
535
은 마스크
1<<5 | 1<<3 | 1<<5 = 40
을 산출 함).
약 3 배 빨라야합니다. 어쨌든, 주요 트리플에 대한 마스크 (예 : ..1
대 001
)를 구분하여 앞에 오는 0을 처리해야합니다.
int distinct(long long int a)
{
int mask= 0;
while (true)
{
int q= a/1000, m= a - 1000 * q;
if (q == 0)
{
static short leading[1000]= { 1, 2, 4, 8, 16, 32, 64, ...}; // Mask for the leading triples
mask|= leading[m];
break;
}
else
{
static short triple[1000]= { 1, 3, 5, 9, 17, 33, 65, ...}; // Mask for the ordinary triples
mask|= triple[m];
a= q;
}
}
static short bits[1024]= { 0, 1, 1, 2, 1, 2, 2, 3, ...}; // Number of bits set
return bits[mask];
}
정적 배열을 사용하여 한 번만로드됩니다.
현재 코드에 어떤 문제가 있습니까? – amit
최적화 기능을 사용하여 컴파일을 시도하십시오 (예 : gcc -O3? –
'if (ele [i]) C++'대신'c = c + ele [i]'를 사용하여 약간 향상시킬 수 있습니다. –