문제 :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
를 들어
디버깅하는 법 배우는 시간 ... 내가 볼 수있는 유일한 palindrome은''2002 "'... – LPs
@LPs이지만 여러 번 디버깅했지만 여전히 작동하는 이유를 이해할 수는 없습니다. 그리고 문제를 다시 읽으십시오. 회상의 아나그램입니다. – Marko