Monday, January 14, 2019

[UVa] 10069 - Distinct Subsequence

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 10069 - Distinct Subsequences
Source            : UVA Online Judge
Category          : Dynamic Programing, Big Integer
Algorithm         : Dynamic Programing
Verdict           : Accepted

  1. import java.io.IOException;  
  2. import java.io.InputStream;  
  3. import java.io.PrintWriter;  
  4. import java.math.BigInteger;  
  5. import java.util.Arrays;  
  6. import java.util.Scanner;  
  7. import java.util.*;  
  8.   
  9. /** 
  10.  * 
  11.  * @author Dipu 
  12.  */  
  13. class Main {  
  14.   
  15.     /** 
  16.      * @param args the command line arguments 
  17.      */  
  18.       
  19.     static BigInteger dp[][];  
  20.     static Boolean memoize[][];  
  21.     static String x, z;  
  22.     static int lenx, lenz;  
  23.           
  24.     public static void main(String args[]) {  
  25.         FastReader in = new FastReader(System.in);  
  26.         PrintWriter pw = new PrintWriter(System.out); 
  27.         dp = new BigInteger[10005][105];  
  28.         memoize = new Boolean[10005][105];  
  29.         int tc = in.nextInt();  
  30.         for (int tcase = 1; tcase <= tc; tcase++) {  
  31.             x = in.next();  
  32.             z = in.next();  
  33.             lenx = x.length();  
  34.             lenz = z.length();  
  35.             for (Boolean[] row : memoize) {  
  36.                 Arrays.fill(row, false);  
  37.             }  
  38.             BigInteger ans = solve(00);  
  39.             pw.println(ans);  
  40.         }  
  41.         pw.close();  
  42.     }  
  43.     public static BigInteger solve(int i, int j) {  
  44.         if (j >= lenz) return BigInteger.ONE;  
  45.         if (i >= lenx) return BigInteger.ZERO;  
  46.         if (memoize[i][j] == truereturn dp[i][j];  
  47.         memoize[i][j] = true;  
  48.         BigInteger sum = BigInteger.ZERO;  
  49.         if (x.charAt(i) != z.charAt(j)) sum = solve(i+1, j);  
  50.         else sum = solve(i+1, j+1).add(solve(i+1, j));  
  51.         return dp[i][j] = sum;  
  52.     }  
  53.       
  54.     static void debug(Object...obj) {  
  55.         System.err.println(Arrays.deepToString(obj));  
  56.     }  
  57.   
  58.     static class FastReader {  
  59.         InputStream is;  
  60.         private byte[] inbuf = new byte[1024];  
  61.         private int lenbuf = 0, ptrbuf = 0;  
  62.   
  63.         public FastReader(InputStream is) {  
  64.             this.is = is;  
  65.         }  
  66.   
  67.         public int readByte() {  
  68.             if (lenbuf == -1throw new InputMismatchException();  
  69.             if (ptrbuf >= lenbuf) {  
  70.                 ptrbuf = 0;  
  71.                 try {  
  72.                     lenbuf = is.read(inbuf);  
  73.                 } catch (IOException e) {  
  74.                     throw new InputMismatchException();  
  75.                 }  
  76.                 if (lenbuf <= 0return -1;  
  77.             }  
  78.             return inbuf[ptrbuf++];  
  79.         }  
  80.   
  81.         public boolean isSpaceChar(int c) {  
  82.             return !(c >= 33 && c <= 126);  
  83.         }  
  84.         private boolean isEndOfLine(int c) {  
  85.             return c == '\n' || c == '\r' || c == -1;  
  86.         }  
  87.   
  88.         public int skip() {  
  89.             int b;  
  90.             while ((b = readByte()) != -1 && isSpaceChar(b)) ;  
  91.             return b;  
  92.         }  
  93.   
  94.         public String next() {  
  95.             int b = skip();  
  96.             StringBuilder sb = new StringBuilder();  
  97.             while (!(isSpaceChar(b))) {  
  98.                 sb.appendCodePoint(b);  
  99.                 b = readByte();  
  100.             }  
  101.             return sb.toString();  
  102.         }  
  103.   
  104.   
  105.   
  106.         public String nextLine() {  
  107.             int c = skip();  
  108.             StringBuilder sb = new StringBuilder();  
  109.             while (!isEndOfLine(c)){  
  110.                 sb.appendCodePoint(c);  
  111.                 c = readByte();  
  112.             }  
  113.             return sb.toString();  
  114.         }  
  115.   
  116.         public int nextInt() {  
  117.             int num = 0, b;  
  118.             boolean minus = false;  
  119.             while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) ;  
  120.             if (b == '-') {  
  121.                 minus = true;  
  122.                 b = readByte();  
  123.             }  
  124.             while (true) {  
  125.                 if (b >= '0' && b <= '9') {  
  126.                     num = (num << 3) + (num << 1) + (b - '0');  
  127.                 } else {  
  128.                     return minus ? -num : num;  
  129.                 }  
  130.                 b = readByte();  
  131.             }  
  132.         }  
  133.   
  134.         public long nextLong() {  
  135.             long num = 0;  
  136.             int b;  
  137.             boolean minus = false;  
  138.             while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) ;  
  139.             if (b == '-') {  
  140.                 minus = true;  
  141.                 b = readByte();  
  142.             }  
  143.   
  144.             while (true) {  
  145.                 if (b >= '0' && b <= '9') {  
  146.                     num = (num << 3) + (num << 1) + (b - '0');  
  147.                 } else {  
  148.                     return minus ? -num : num;  
  149.                 }  
  150.                 b = readByte();  
  151.             }  
  152.         }  
  153.   
  154.         public double nextDouble() {  
  155.             return Double.parseDouble(next());  
  156.         }  
  157.   
  158.         public char[] next(int n) {  
  159.             char[] buf = new char[n];  
  160.             int b = skip(), p = 0;  
  161.             while (p < n && !(isSpaceChar(b))) {  
  162.                 buf[p++] = (char) b;  
  163.                 b = readByte();  
  164.             }  
  165.             return n == p ? buf : Arrays.copyOf(buf, p);  
  166.         }  
  167.   
  168.         public char readChar() {  
  169.             return (char) skip();  
  170.         }  
  171.     }  
  172. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.