(defun main (&rest argv) (declare (ignorable argv)) (let* ((s (read-line)) (dp (make-array (list 2 21 21 21 21) :element-type 'integer :initial-element -1)) (a 0) (b 1) (res 0)) (setf (aref dp 0 0 0 0 0) 0) (loop for c across s do (dotimes (k 21) (dotimes (u (1+ k)) (dotimes (r (1+ u)) (dotimes (o (1+ r)) (let ((now (aref dp a k u r o))) (unless (= now -1) (setf (aref dp b k u r o) (max (aref dp b k u r o) now)) (when (and (or (char= c #\K) (char= c #\?)) (<= (1+ k) 20)) (setf (aref dp b (1+ k) u r o) (max (aref dp b (1+ k) u r o) now))) (when (and (or (char= c #\U) (char= c #\?)) (<= (1+ u) k)) (setf (aref dp b k (1+ u) r o) (max (aref dp b k (1+ u) r o) now))) (when (and (or (char= c #\R) (char= c #\?)) (<= (1+ r) k)) (setf (aref dp b k u (1+ r) o) (max (aref dp b k u (1+ r) o) now))) (when (and (or (char= c #\O) (char= c #\?)) (<= (1+ o) k)) (setf (aref dp b k u r (1+ o)) (max (aref dp b k u r (1+ o)) now))) (when (and (or (char= c #\I) (char= c #\?)) (<= (1+ now) o)) (setf (aref dp b k u r o) (max (aref dp b k u r o) (1+ now)))))))))) (rotatef a b)) (dotimes (k 21) (dotimes (u (1+ k)) (dotimes (r (1+ u)) (dotimes (o (1+ r)) (setq res (max res (aref dp a k u r o))))))) (format t "~d~%" res))) (main)