D - 무엇
질문의 의미 : 뿌리 트리에, 루트 노드 1, $ Q $ 작업이 모든 노드의 노드와 하위 트리의 값을 더한 작업의 값의 가중치 각각은 각 노드의 최종 무게를 요청 값.
아이디어 : 라인에 DFS 다시 미분.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; CONST의 INT N = 2E5 + 7 ; 벡터 < INT > G [N]; INT DFN [N], ID, N, Q, 마지막 [N], POS [N]; 긴 긴 발 [N], ANS [N]; 보이드 DFS는 ( int로 , U을 int로 FA)을 { DFN [U] = ++ ID; POS [ID] = U; 대 (자동 V : G [U]) { 경우 (V == FA)가 계속 ; DFS (V U, 께); } 마지막으로 [U] = ID; } 값 int () {메인 scanf와 ( " %의 D % d에 " , N, Q); 대 ( int로 I = 1 , U, V, I는 N <; 내가 ++ ) { scanf와 ( " % d 개 %의 D ' , U, V); G [U] .push_back (V); G [V] .push_back (U); } DFS ( 1 , 0 ); 반면 (q-- ) { 긴 길이 (X); int로 U 단계; scanf와 ( " % d 개 %의 LLD ' , U, X); 발 [DFN [U] + = X; 발 [최후 [U]는 + 1 ] - =의 X; } 위한 ( int로 I = 1 ; I ++는, 난 <= N ) { 발 [I] + = 브로 [I - 1 ]; ANS [POS [I] = 브로 [I]; } 위한 ( int로 I = 1 ; 나는 <= N; ++ i가 ) 의 printf ( " %의 LLD %의 C를 " , ANS [I], " \ n " [I == N]); 반환 0 ; }
E - 불순물의 문자열
문제의 의미 $ S $, $ t $, $ S $ 두 문자열 $ 10 $ ^ $ S로 {100} 뷰 '$으로, 즉,'ABC '가된다'ABCABC ... ABCABC '$ Q 복사 인덱스 t의 제 1 단부 위치는 전혀 출력하지 존재하는 $ S '$ 시퀀스가 발생 $ -1.
샘플로
conteStcONtest : $의 S '$
$ T $ : 아들
일치하는 위치에 활용, 대답은 10입니다.
생각 : 서브 문제는 $ 네브라스카를 사용할 수있는 [I]는 [J]를 $ 문자열을 나타내는 $의 $ $ I $ 위치에, 다음 $의 J의 $ 문자의 위치는, 다음 쓸어 및 후면에서 전처리 할 수있다 통계, 전 전 현재에는 $의 t_ {J} 위치 후 $이 문자를 여러 일치 할 수 없습니다 욕심 일치 $ s의의 $에서 $ T는 $로 대답, 그 다음 $의에 $ 문자열, 대답에 갈 필요가있다 단지 $ S $ 뛰어 얼마나 많은 문자열을보고 최종 위치입니다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; CONST의 INT N = 1E5 + 7 ; 문자 S [N], T [N]; INT NE [N] [ 26 ]; 나오지 [로 (26) ]; 값 int () {메인 scanf와 ( " % S %의 S ' , S + 1 , t + 1 ); INT LEN1의 strlen = (S + 1 ) = LEN2의 strlen (t + 1 ); 대 ( INT I = LEN1; I> = 0 ; 난 ... ) { 대 ( INT의 J = 0 ; J < 26 ; ++ J ) NE [I] [J] = 전나무 [J] 경우 (I) 전나무 [S [I] - ' ' = I; } INT의 ID = 0 , ANS = 1 ; 위한 ( int로 I = 1 ; I <= LEN2; 내가 ++ ) { 경우 (NE [ID]를 t [I] - ' ' ]) { ID = NE [ID]를 t [I] - ' ' ]; } 다른 { 경우 (FIR [t의 [I] -! ' ' ]) { 풋 ( " -1 " ); 반환 0 ; } ID = 전나무 [t [I] - ' ' ]; 년 ++ ; } } 의 printf ( " % LLD \ 없음 " , 1LL * (ANS - 1 ) * + LEN1 ID); 반환 0 ; }
F - 우연의 일치
질문의 의미 : $ L $와 $ R의 $ 감안할 때, 질문은 $ X, $ 충족 $ Y $ 모 $ X = y를 $의 XOR의 $ y를 \ 왼쪽 (\ 당량 X \ 당량 y를 \의 당량의 R \ 권리 L)의 얼마나 많은 X의 $
생각 :
$ \ Y $ 모 $ X는 <X $ 때문에
$ \ 따라서 Y는 XOR $ X를 $ <X $으로의
설명은 Y $과 달러 것이다 $ X $ 최상위 비트 (1)가 동일한 위치에 있어야
$의 \ 따라서 \ dfrac {Y} X} {<$ 2
$ \ 따라서 Y - X = Y $ $ X는 XOR $
몇 가지 예는 이러한 조건을 만족하는 것이 발견되며, 이진 $ X $ $ $ Y 직접 감산 대출하지 않고도 달성 될 수 , 등
$ Y $ : 10110 (22 임)
$의 X의 $ : 10010 (18 임)
이 때 $ y는 $의 XOR을 $ X = Y - X = 4 $가
$ y를 $ 및 $ X = X 얻을 수 $ 및 $ X $ 및 가장 중요한 비트 $의 Y $ 1과 동일한 위치는
다음 DP 숫자를 할 수 있습니다.
Y $ $ R은 $, $의 X $으로의 L에 $ $ 이상인 $를 초과하지 않는 DP 디지털 열거 경우 동시에 2 진수는 경우가 어디에 전류 선행 0 A $ Y $ 및 X의 $ $ 그 $ y는 $보다 클 수 없다마다 $의 X $으로 동일하고 어떤 보증이어야 라인 ($의 X $으로 현재 비트가 1이고, 현재 위치가 $ Y $ 0 나타남).
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <. 비트 / stdc ++ H> #DEFINE가 긴 긴 것이다 사용 스페이스 성병; CONST INT MOD 1E9 + = 7 ; LL의 DP [ 70 ] [ 2 ] [ 2 ] [ 2 ]; 해결하는 것이다 (LL의 L, LL R, int로 볼때, BOOL limit1, BOOL limit2, 부울 리드) { 경우 POS (< 0 ) 창 1 ; LL 및 ANS = DP [POS] limit1] limit2 [리드]; 만약 - (! ANS = 1 ) 반환 ; ANS ANS = 0 ; INT UP2 = limit2? (R & POS >> 1 ) 1 ; INT UP1 = limit1? (L >> POS 및 1 ) 0 ; 위한 ( int로 = UP1를 I 단계; 나는 <= 1 ; I ++ ) 대 ( INT J = 0 ; J <= UP2; J ++ ) { 경우 (I> J) 계속 ; 만약 (! 리드 & & I = j는) 계속 ; (ANS + = 해결 (L, R, POS - 1 , limit1 && I == UP1, limit2 && j를 == UP2 && j 개의 리드 == 0 )) % = MOD; } 반환 년; } 값 int () {메인 memset 함수 (DP, - 1 , 를 sizeof (DP)); LL의 L, R; scanf와 ( " %의 LLD의 %의 LLD ' , L, R); 의 printf ( " %의 LLD " (해결 L, R, 60 , 1 , 1 , 1 )); 반환 0 ; }