POJ 刷题系列:1068. Parencodings
来源:互联网 发布:高速公路计量收费软件 编辑:程序博客网 时间:2024/06/06 03:51
POJ 刷题系列:1068. Parencodings
传送门:1068. Parencodings
题意:
给出一组P-Sequence,每个数代表当前右括号之前的所有左括号数,求W-Sequence,表示当前右括号与它对应的左括号之间的左括号数。还是看例子吧:
思路:
抓住两点,对应于P-Sequence,当右括号为i时,插入的左括号数为p[i] - p[i - 1]。对于W-Sequence,当右括号i时,求出与之对应的左括号下标j,答案即为(i - j + 1) / 2.
代码如下:
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.Arrays;import java.util.Map;import java.util.StringTokenizer;public class Main{ String INPUT = "./data/judge/201712/P1068.txt"; public static void main(String[] args) throws IOException { new Main().run(); } void read() { int t = ni(); while (t --> 0) { int n = ni(); int[] p = new int[n]; for (int i = 0; i < n; ++i) { p[i] = ni(); } StringBuilder sb = new StringBuilder(); int pre = 0; for (int i = 0; i < n; ++i) { int cnt = p[i] - pre; for (int j = 0; j < cnt; ++j) { sb.append("("); } sb.append(")"); pre = p[i]; } char[] cs = sb.toString().toCharArray(); int[] w = new int[n]; int[] stack = new int[cs.length + 16]; int tot = 0; int k = 0; for (int i = 0; i < cs.length; ++i) { if (cs[i] == '(') { stack[tot++] = i; } else { w[k++] = (i - stack[tot - 1] + 1) / 2; tot --; } } for (int i = 0; i < n; ++i) { out.print(w[i] + (i + 1 == n ? "\n" : " ")); } } } FastScanner in; PrintWriter out; void run() throws IOException { boolean oj; try { oj = ! System.getProperty("user.dir").equals("F:\\oxygen_workspace\\Algorithm"); } catch (Exception e) { oj = System.getProperty("ONLINE_JUDGE") != null; } InputStream is = oj ? System.in : new FileInputStream(new File(INPUT)); in = new FastScanner(is); out = new PrintWriter(System.out); long s = System.currentTimeMillis(); read(); out.flush(); if (!oj){ System.out.println("[" + (System.currentTimeMillis() - s) + "ms]"); } } public boolean more(){ return in.hasNext(); } public int ni(){ return in.nextInt(); } public long nl(){ return in.nextLong(); } public double nd(){ return in.nextDouble(); } public String ns(){ return in.nextString(); } public char nc(){ return in.nextChar(); } class FastScanner { BufferedReader br; StringTokenizer st; boolean hasNext; public FastScanner(InputStream is) throws IOException { br = new BufferedReader(new InputStreamReader(is)); hasNext = true; } public String nextToken() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { hasNext = false; return "##"; } } return st.nextToken(); } String next = null; public boolean hasNext(){ next = nextToken(); return hasNext; } public int nextInt() { if (next == null){ hasNext(); } String more = next; next = null; return Integer.parseInt(more); } public long nextLong() { if (next == null){ hasNext(); } String more = next; next = null; return Long.parseLong(more); } public double nextDouble() { if (next == null){ hasNext(); } String more = next; next = null; return Double.parseDouble(more); } public String nextString(){ if (next == null){ hasNext(); } String more = next; next = null; return more; } public char nextChar(){ if (next == null){ hasNext(); } String more = next; next = null; return more.charAt(0); } } static class D{ public static void pp(int[][] board, int row, int col) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { sb.append(board[i][j] + (j + 1 == col ? "\n" : " ")); } } System.out.println(sb.toString()); } public static void pp(char[][] board, int row, int col) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { sb.append(board[i][j] + (j + 1 == col ? "\n" : " ")); } } System.out.println(sb.toString()); } } static class ArrayUtils { public static void fill(int[][] f, int value) { for (int i = 0; i < f.length; ++i) { Arrays.fill(f[i], value); } } public static void fill(int[][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } public static void fill(int[][][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } } static class Num{ public static <K> void inc(Map<K, Integer> mem, K k) { if (!mem.containsKey(k)) mem.put(k, 0); mem.put(k, mem.get(k) + 1); } }}
阅读全文
0 0
- POJ 刷题系列:1068. Parencodings
- POJ 1068.Parencodings
- POJ 1068 Parencodings 模拟题
- poj 1064 Parencodings(模拟题)
- POJ Parencodings
- poj Parencodings
- 【POJ】Parencodings
- POJ 1068:Parencodings:模拟水题
- poj 1068 Parencodings(模拟题)
- poj 1068 Parencodings
- POJ 1068 Parencodings
- POJ 1068 Parencodings
- poj 1068 Parencodings
- POJ 1068 Parencodings
- POJ 1068 Parencodings
- POJ 1068 Parencodings 模拟
- POJ 1068 Parencodings
- poj 1068 Parencodings
- 17个新手常见Python运行时错误
- js节流
- *Protecting the Flowers(POJ 3262, 贪心)
- Myeclipse 2017破解版教程
- Java开发练习9.1 网络编程UDP
- POJ 刷题系列:1068. Parencodings
- 数据结构单链表之创建链表(头插法)
- 数据结构实验之查找七:线性之哈希表
- git_初探_连接远程访问库
- 基于Qt5.9的QMQTT协议跟EMQ代理服务器的连接教程
- springBoot配置路径
- numpy.random.uniform介绍
- Hdoj 1493 QQpet exploratory park
- 监控