Submission #6009080


Source Code Expand

;; -*- coding: utf-8 -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defparameter OPT
    #+swank '(optimize (speed 3) (safety 2))
    #-swank '(optimize (speed 3) (safety 0) (debug 0)))
  #+swank (progn (ql:quickload '(:cl-debug-print :fiveam))
                 (shadow :run)
                 (use-package :fiveam))
  #-swank (set-dispatch-macro-character #\# #\> (lambda (s c p) (declare (ignore c p)) (read s nil (values) t))))
#+swank (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)

;; BEGIN_INSERTED_CONTENTS
(declaim (ftype (function * (values fixnum &optional)) read-fixnum))
(defun read-fixnum (&optional (in *standard-input*))
  (declare #.OPT)
  (macrolet ((%read-byte ()
               `(the (unsigned-byte 8)
                     #+swank (char-code (read-char in nil #\Nul))
                     #-swank (sb-impl::ansi-stream-read-byte in nil #.(char-code #\Nul) nil))))
    (let* ((minus nil)
           (result (loop (let ((byte (%read-byte)))
                           (cond ((<= 48 byte 57)
                                  (return (- byte 48)))
                                 ((zerop byte) ; #\Nul
                                  (error "Read EOF or #\Nul."))
                                 ((= byte #.(char-code #\-))
                                  (setf minus t)))))))
      (declare ((integer 0 #.most-positive-fixnum) result))
      (loop
        (let* ((byte (%read-byte)))
          (if (<= 48 byte 57)
              (setq result (+ (- byte 48) (* 10 (the (integer 0 #.(floor most-positive-fixnum 10)) result))))
              (return (if minus (- result) result))))))))

(defmacro dbg (&rest forms)
  #+swank
  (if (= (length forms) 1)
      `(format *error-output* "~A => ~A~%" ',(car forms) ,(car forms))
      `(format *error-output* "~A => ~A~%" ',forms `(,,@forms)))
  #-swank (declare (ignore forms)))

(defmacro define-int-types (&rest bits)
  `(progn
     ,@(mapcar (lambda (b) `(deftype ,(intern (format nil "UINT~A" b)) () '(unsigned-byte ,b))) bits)
     ,@(mapcar (lambda (b) `(deftype ,(intern (format nil "INT~A" b)) () '(signed-byte ,b))) bits)))
(define-int-types 2 4 7 8 15 16 31 32 62 63 64)

(declaim (inline println))
(defun println (obj &optional (stream *standard-output*))
  (let ((*read-default-float-format* 'double-float))
    (prog1 (princ obj stream) (terpri stream))))

(defconstant +mod+ 1000000007)

;; Body
(declaim (inline bitree-update!))
(defun bitree-update! (bitree index1 index2 delta)
  "destructively increments the array: array[index1][index2] += delta."
  (declare ((integer 0 #.most-positive-fixnum) index1 index2))
  (let ((length1 (array-dimension bitree 0))
        (length2 (array-dimension bitree 1)))
    (do ((i index1 (logior i (+ i 1))))
        ((>= i length1))
      (declare (fixnum i))
      (let ((base-i (array-row-major-index bitree i 0)))
        (declare (fixnum base-i))
        (do ((j index2 (logior j (+ j 1))))
            ((>= j length2))
          (declare (fixnum j))
          (setf (row-major-aref bitree (+ base-i j))
                (funcall (lambda (x y) (mod (+ x y) +mod+))
                         (row-major-aref bitree (the fixnum (+ base-i j)))
                         delta)))))
    bitree))
 
(declaim (inline bitree-sum))
(defun bitree-sum (bitree end1 end2)
  "returns the sum of the rectangle region: array[0][0] + ... +
array[end1-1][end2-1]."
  (declare ((integer 0 #.most-positive-fixnum) end1 end2))
  (let ((res 0))
    (declare (type uint62 res))
    (do ((i (- end1 1) (- (logand i (+ i 1)) 1)))
        ((< i 0))
      (declare (fixnum i))
      (let ((base-i (array-row-major-index bitree i 0)))
        (declare (fixnum base-i))
        (do ((j (- end2 1) (- (logand j (+ j 1)) 1)))
            ((< j 0))
          (declare (fixnum j))
          (incf res (row-major-aref bitree (the fixnum (+ base-i j)))))))
    (mod res +mod+)))

(defun main ()
  (declare #.OPT)
  (let* ((n (read))
         (m (read))
         (ss (make-array n :element-type 'uint32))
         (ts (make-array m :element-type 'uint32))
         (bitree (make-array '(2000 2000) :element-type 'uint32 :initial-element 0)))
    (declare (uint16 n m))
    (dotimes (i n) (setf (aref ss i) (read-fixnum)))
    (dotimes (i m) (setf (aref ts i) (read-fixnum)))
    (dotimes (i n)
      (dotimes (j m)
        (when (= (aref ss i) (aref ts j))
          (bitree-update! bitree i j (+ 1 (bitree-sum bitree i j))))))
    (println (mod (+ 1 (bitree-sum bitree n m)) +mod+))))

#-swank(main)

Submission Info

Submission Time
Task E - Common Subsequence
User sansaqua
Language Common Lisp (SBCL 1.1.14)
Score 500
Code Size 4618 Byte
Status AC
Exec Time 625 ms
Memory 34532 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 5
AC × 33
Set Name Test Cases
Sample s1.txt, s2.txt, s3.txt, s4.txt, s5.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, s1.txt, s2.txt, s3.txt, s4.txt, s5.txt
Case Name Status Exec Time Memory
01.txt AC 217 ms 34532 KiB
02.txt AC 92 ms 25060 KiB
03.txt AC 94 ms 25060 KiB
04.txt AC 92 ms 25056 KiB
05.txt AC 92 ms 25060 KiB
06.txt AC 101 ms 33256 KiB
07.txt AC 102 ms 33248 KiB
08.txt AC 101 ms 33256 KiB
09.txt AC 99 ms 33252 KiB
10.txt AC 99 ms 33252 KiB
11.txt AC 99 ms 33252 KiB
12.txt AC 98 ms 33252 KiB
13.txt AC 99 ms 33248 KiB
14.txt AC 98 ms 33252 KiB
15.txt AC 98 ms 33256 KiB
16.txt AC 207 ms 33256 KiB
17.txt AC 159 ms 33248 KiB
18.txt AC 137 ms 33252 KiB
19.txt AC 128 ms 33248 KiB
20.txt AC 122 ms 33252 KiB
21.txt AC 625 ms 33256 KiB
22.txt AC 611 ms 33256 KiB
23.txt AC 92 ms 18912 KiB
24.txt AC 95 ms 18916 KiB
25.txt AC 94 ms 33252 KiB
26.txt AC 93 ms 25056 KiB
27.txt AC 100 ms 33248 KiB
28.txt AC 99 ms 33256 KiB
s1.txt AC 94 ms 25060 KiB
s2.txt AC 93 ms 25056 KiB
s3.txt AC 92 ms 25064 KiB
s4.txt AC 93 ms 25056 KiB
s5.txt AC 92 ms 25060 KiB