https://ac.nowcoder.com/acm/contest/4010/C
이 질문은 하나 개 베어 님 게임 유형;
(1 ~ N) 전에 청구 프로그램 스택에서 승리하기 위해 결정된다.
이러한 유형의 경우, 우리는 이제 제 (K)를 적재하는 경우, 우리는 먼저 단독 또는 적층 전에 배타적 OR 값 (K);
다음 동작 (k)의 각 스택 : TMP = 합 ^ A [i]는, 배타적 OR XOR 항목의 합계치가 나는 한 값보다 작 으면 [I] 프로그램 번호 +1;
그러나,이 방법은 N ^ 2의 복잡도이고;
우리는 각 이진 값이 유지됩니다 스택-K의 사전 필요가 그래서;
그리고 가장 중요한 비트, 즉, 다음 인덱스 번호의 번호가 저장되어, 배타적 논리합의 총 인덱스 값을 열거하는 방법에 많은 프로그램의 종류;
이유는, 총 XOR 값이 하나 XOR 수 있으면되므로 그 다음, 이하 A [i]를 초과 할 것, 전체 배타적 OR 값 인덱스가 A [i]를 XOR 중 어느 하나를 보유하고 있음을 증명하는 것이기에 이 모두 1이다이고;
XOR은 0이 합계 값 배타적 OR 후에, 이것은 [I]보다 확실히 작다;
1 #INCLUDE <비트 / stdc ++ H.> 2 사용 공간은 수 std; 3 CONST INT maxn 1E5 + = 1 ; 4 형식 정의 긴 긴 LL; 5 줄게 A [maxn, NUM [maxn, 합계 = 0 ; 6 INT의 주 () 7 { 8 INT N; 도 9 는 scanf ( " %의 D ' , N); 10 대 ( INT 난 = 1 ; 나는 <= N; ++ i)는 { 11 는 scanf ( " %의 LLD을" , & A [I]); 12 합 ^ = A [i]는, 13 대 ( INT J = 0 ; J < 62 ; ++ j)에 { 14 의 경우 ((a [I] >> J) 1 ) NUM [J] ++ ; 15 } 16 의 경우 (합계 == 0 ) { 17 의 printf ( " 0 \ n " ); (18)는 계속해서 , 19 } 20 LL t = 합 CNT = - 1 ; 21 동안 (t) CNT ++, t는 >> = 1 ; 22 의 printf ( " %의 LLD \ n " , NUM [CNT]); 23 } 24 반환 0 ; 25 }