2017-05-05 1 views
0

문제 :Codility challenge -이 솔루션은 왜 작동합니까?

숫자의 문자열이 주어진다면, 임의의 회문의 아나그램 인 서브 워드 (일관된 서브 시퀀스)의 수를 계산하십시오.

예 :

입력 문자열

"02002"이 결과는 11이어야, 즉 :

"0", "2", "0", "0", "2", "00 ","020 ","200 ","002 ","2002 ","02002 "

아래의 해결책을 볼 수는 있지만 그 이유는 알 수 없습니다. 특히 내부 루프의 요점을 이해하지 못합니다. 아무도이 뒤에 논리를 설명 할 수 있습니까? https://codility.com/programmers/task/winter_lights/ :

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

#define M 1000000007 
#define COLORS 10 
#define SUBSETS (1 << (COLORS)) 

int solution(char *S) { 
    int len, result; 
    int *values; 
    int v, idx, middle, mask; 

    result = 0; 
    values = calloc(SUBSETS, sizeof(int)); 
    //new_values = calloc(SUBSETS, sizeof(int)); 
    len = strlen(S); 
    mask = 0; 

    for (idx = 0; idx < len; idx++) { 
     v = S[idx] - '0'; 
     mask ^= (1 << v); 
     values[mask^(1 << v)] += 1; 
     result = (result + values[mask]) % M; 
     for (middle = 0; middle < COLORS; middle++) { 
      result = (result + values[mask^(1 << middle)]) % M; 
     } 
    } 
    return result; 
} 

자세한 내용은에서 필요한 경우. 당신이 i에서 idx에 조명이 회문을 형성 할 수 있다는 i는 계산하려는 각 idx를 들어

+1

디버깅하는 법 배우는 시간 ... 내가 볼 수있는 유일한 palindrome은''2002 "'... – LPs

+0

@LPs이지만 여러 번 디버깅했지만 여전히 작동하는 이유를 이해할 수는 없습니다. 그리고 문제를 다시 읽으십시오. 회상의 아나그램입니다. – Marko

답변

1

. 즉, 각 유형의 빛이 짝수 개임을 의미하거나, 하나를 제외하고는 모든 조명이 짝수입니다 (회귀선 중간에 위치).

코드는 O (n^2) 동작을 피하기 위해 트릭을 사용하여 i을 계산합니다. 인덱스 idx에서 빛을 처리 한 후 배열 values에는 각 m에 대해 i<idx의 숫자가 포함되어 0 ~ i의 조명 시퀀스에는 각 조명의 짝수 또는 홀수 (m의 비트에 따라 다름)가 포함됩니다. 예를 들어, values[3]에는 조명의 초기 시퀀스 수가 포함됩니다 (최대, 홀수는 0 번과 1 번 홀수, 짝수는 다른 라이트입니다). 이 배열

idx에서 끝나는 셔플 회문를 계산하는 것은 간단하다 : 최대 idx에 마스크 mask이면 모든 조명 짝수 회문의 수와 좌측 시퀀스의 수와 동일 동일한 마스크 (예 : values[mask]). 유사하게, 홀수 번째 빛 (middle)을 제외한 짝수 개의 빛을 가진 회문수의 수는 마스크 mask^(1<<middle)을 가진 왼쪽 시퀀스의 수와 동일합니다.

+0

이것을 명확히 할 수 있습니까? 예를 들어 값 [3]에는 조명의 초기 시퀀스 수 (홀수 번호의 광원 0 및 1, 그리고 짝수 개의 다른 광원이있는 idx까지)이 포함되어 있습니까? – Marko

+0

3 = 0b00000011. 비트 0과 1이 설정됩니다. –

+0

나는 여전히이 부분을 얻지 못한다. 어째서 사실인가 : idx까지의 마스크가 마스크라면, 모든 빛의 짝수를 가진 문장의 수는 같은 마스크를 가진 왼쪽 시퀀스의 수와 같다. (즉, 값 [마스크]) – Marko

관련 문제