C가 - 당신은 WASD - 문자열을 주어진 ... CodeForces - 1202C


#INCLUDE <비트 / STDC ++ H.> 사용하여 A 스페이스 STD, 타입 정의 LL; CONST의 INT의 MAXN = 2E5 + 100 ; 숯불 ; S는 [MAXN] / * 이 문자 부담이되기 때문에, 사용자가 캐릭터를 추가하고, 추가 할 수없는 최소한의 권리 약간의 왼쪽으로 이동하지만,이 촛불 오른쪽 오른쪽에, 그리고 가치가되었다 우리가 먼저 수직 방향을 고려, 우리가이 위치 0에서 가정, 그는 이동 된 위치에, 우리는 지점 1의 차이입니다입니다 또한 다음 그 뒤에 모든 지점의 좌표가 플러스 W의 앞에 위치에있는 당신이 위치 앞에서의를 추가하면, 그 뒤에 모든 지점의 다음 좌표, 하나의 마이너스가 될 것입니다 당신이 감소 될 수 있도록하려면, 당신은 추가 경우 나중의 최대 값, 최소값을 갖고 있지 전면이없는 후자의 최소 값을 가질 수 있으며, 최대 값 앞에 가질 수 없거나하지 않는 경우에 1- 것을 발견하며,이 경우에 추가 될 수 첨가 즉, 감소하지 증가도 같은 종류의 수 있습니다 수직 및 수평 상황으로, 우리는 하나 개의 측면을 고려 다시 모든 추가 한 후, 우리는 당신이 하나를 추가 할 것인지 명확해야 그런 다음 모든 당신은 뒤에 마이너스 하나 빼기가 수직 이 많은 시간을 최대 값과 최소값 많은 시간에 도달하면 마지막으로는 전술의 제 1 최소의 최대 값, 우리는 단지 최소 감소이면의 값을 증가 (1) 그리고 당신은 다른의 위치를 변경하거나 값이 커지게하기 위해선, 값은 변경하거나 할 최소가 처음 최대 값 이전에 발생하는 경우 한 뒤 최소를 뺀 하나로서, 그 값 것, 마지막으로 2 작아지고 다른 두 케이스 및 변화로서 변경하거나 큰 일으키지 않았다 C)* / INT LEN, LL의 maxlast, maxfirst, minlast, minfirst; INT의 작업 ( C, C1) { maxlast = maxfirst = minlast = minfirst = 0 ; LL MAX_ = 0 , min_ = 0 ; LL Y = 0 ; 위해 ( int로 = I를 0 ; I는 ++; I <렌 ) { IF (S [I] == Y ++ ; 다른 경우 (S [I] == C1) Y - ; 경우 (MAX_ < Y) { maxlast = maxfirst = I; MAX_ = Y; } 다른 경우 (예 == MAX_) { maxlast = I; } 경우 (Y < min_) { minlast = minfirst = I; min_ = Y; } 다른 경우 (예 == min_) { minlast = I; } } (MAX_ - min_ + 1 ); } INT 의 main () { INT의 t; scanf와 ( " %의 D " , t); 반면 (t-- ) { 는 scanf ( " %의 S ' , S); LEN = 나 strlen (S); INT의 플래그 = 0 , 인 flag1 = 0 ; LL N = 일 ( ' W ' , ' S '); 경우 ((maxlast <minfirst || maxfirst> minlast) && N> 2 ) 플래그 = 1 ; LL의 m = 일 ( ' ' , ' D ' ); 경우 ((maxlast <minfirst || maxfirst> minlast) && m> 2 ) 인 flag1 = 1 ; LL ANS = N *의 m; 경우 (플래그 && 인 flag1) ANS = 분 (n 개 * (M- 1 ), m의 * N- ( 1 )); 다른 경우 (플래그)가 ANS = N- ( 1 ) * m; 다른 만약 (인 flag1) ANS = (M- 1 ) * N; 의 printf ( " % LLD \ 없음 " , ANS); } 반환 0 ; }

 

추천

출처www.cnblogs.com/zhangzhenjun/p/11708116.html