[Java]伯俊5430号[Ac]Java


白俊5430号です.
https://www.acmicpc.net/problem/5430

質問する


善英は週末は用事がないので、新しいコミュニケーション言語を作りました.AC電源は、整数配列を演算するために作成される言語です.この言語には2つの関数R(反転)とD(破棄)がある.
関数Rは、配列内の数値の順序を反転させる関数であり、Dは、最初の数値を破棄する関数である.配列が空で、Dを使用するとエラーが発生します.
を選択します.たとえば、「AB」はAを実行し、Bを実行する関数です.たとえば、「RDD」は、アレイを反転させ、最初の2つの数字を破棄する関数です.
配列の初期値と実行する関数を指定する場合は、プログラムを作成して最終結果を取得します.

入力


第1行は、試験例の個数Tを与える.Tは最大100です.
各テストケースの最初の行には、実行する関数pが与えられる.pの長さは1以上であり、100000未満である.
次の行は、配列内の数値nを与えます.(0 ≤ n ≤ 100,000)
次の行は、[x 1,...,xn]と同じ形式の配列の整数を与えます.(1 ≤ x i ≤ 100)
試験例全体におけるpの長さの和nの合計は70万を超えない.

しゅつりょく


各テストケースについて、関数の結果を入力として所定の整数配列に出力します.エラーが発生した場合はerrorを出力します.

入力例

4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]

サンプル出力

[2,1]
error
[1,2,3,5,8]
error

考える


問題を理解し、Dequeの使用をすぐに確認します.
最初はインデックスとは思いもよらずArrayで実現しようとしましたが、結局タイムアウトで他の人の解答しか参考にできませんでした.
タイムアウトの原因は簡単です.前後を交互に消去し、繰り返します.
位置を変更し続け、アレイの位置を前に引っ張るなどしなければなりません.
最大100個のテストケースが10万個の数字で構成されていると思う場合は、
アレイを反転させるだけで10万回の操作が必要です.これは巨大な資源の浪費である.
この問題の要点
ここで身につけなければならないのは私が逃した部分です.

  • 最初はDequeが空の場合は「error」を無条件に出力しますが、よく考えてみるとDequeが空の場合は「[]」を出力する必要があります.

  • 配列が空の場合、Rに「error」は表示されません.

  • 配列は最大100個の数値を含むことができるため、charat()を使用して配列を中断することはできません.
  • アクション


    まず、配列形式で入力されたテストキャビネットを[,]に従ってマークし、dequeと番号付けします.関数はpとして保存されます.
    			StringTokenizer st = new StringTokenizer(br.readLine(),"[],");
    			deque = new ArrayDeque<Integer>();
    
    			for(int i=0; i<number; i++) {
    				deque.add(Integer.parseInt(st.nextToken()));
    			}
    交流関数を実行します.pの入力値で関数を実行します.forward_direction は、現在のアレイの順序が順方向または逆方向であることを示す.
    デフォルト値は順方向であるため、trueに初期化されます.pの値は、RとDを区別するために文字で区切られる.
    Rの場合、逆変換forward_direction.
    			if(function == 'R') {
    				forward_direction = !forward_direction;
    				continue;
    			}
    次に、条件をforward_directionの値、すなわち方向に設定する.
    順方向ではpollFirstと行ってnullを返すと空になりますがDを使用しているのですぐに「error」に戻ります.
    逆にするとpollLastとともにnullを返すと空になりますが、Dを使用しているのですぐに「error」を返します.
    			// 정방향일 때
    			if( forward_direction ) {
    
    				// 덱이 비었으면,
    				if(deque.pollFirst() == null) {
    					sb.append("error\n");
    					return;
    				}
    			}
    			// 역방향 일때 forward_direction = true
    			else {
    
    				if(deque.pollLast() == null) {
    					sb.append("error\n");
    					return;
    				}
    			}
    その後、出力はmakePrintStringメソッドが担当する.
    「error」が表示されない場合は、ここに移動します.「error」の場合、ここに戻ることはできません.
    まず「[」をsbに追加します.forward_directionがtrueの場合は順方向であるため、第1行出力後
    『,』がくっつくかどうかを判断するために、Deque.ID isEmpty()
    Dequeが空でない場合は、「,」を真ん中に置いて、前から要素を取り出し続けます.
    逆方向deque.pollLast()だけが異なり、プロセスは同じです.
    			if(forward_direction) {
    				sb.append(deque.pollFirst());
    
    				while(!deque.isEmpty()) {
    					sb.append(',').append(deque.pollFirst());
    				}
    			}
                else {
    				sb.append(deque.pollLast());
    
    				while(!deque.isEmpty()) {
    					sb.append(',').append(deque.pollLast());
    				}
    			}
    最後に「」を貼り、改行をつけて終わります.

    TMI


    解が終わったら交流で呼び出します.

    コード#コード#

    import java.io.*;
    import java.util.*;
    
    public class Main {
    	static ArrayDeque<Integer> deque;
    	static StringBuilder sb = new StringBuilder();
    
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    		int T = Integer.parseInt(br.readLine());
    		while(T --> 0) {
    
    			String p = br.readLine();
    			int number = Integer.parseInt(br.readLine());
    
    			StringTokenizer st = new StringTokenizer(br.readLine(),"[],");
    			deque = new ArrayDeque<Integer>();
    
    			for(int i=0; i<number; i++) {
    				deque.add(Integer.parseInt(st.nextToken()));
    			}
    
    			AC(p);
    		}
    
    		System.out.println(sb);
    	} // End of main
    
    	static void AC(String p) {
    		boolean forward_direction = true;
    
    		for(char function : p.toCharArray()) {
    
    			if(function == 'R') {
    				forward_direction = !forward_direction;
    				continue;
    			}
    
    			// 정방향일 때
    			if( forward_direction ) {
    
    				// 덱이 비었으면,
    				if(deque.pollFirst() == null) {
    					sb.append("error\n");
    					return;
    				}
    			}
    			// 역방향 일때 forward_direction = true
    			else {
    
    				if(deque.pollLast() == null) {
    					sb.append("error\n");
    					return;
    				}
    			}
    		}
    
    		makePrintString(forward_direction);
    	}
    
    	private static void makePrintString(boolean forward_direction) {
    
    		sb.append('[');
    
    		if(deque.size() > 0) {
    			if(forward_direction) {
    				sb.append(deque.pollFirst());
    
    				while(!deque.isEmpty()) {
    					sb.append(',').append(deque.pollFirst());
    				}
    			}
    			else {
    				sb.append(deque.pollLast());
    
    				while(!deque.isEmpty()) {
    					sb.append(',').append(deque.pollLast());
    				}
    			}
    		}
    
    		sb.append(']').append('\n');
    	} // End of makePrintString
    } // End of class