小记一下 List+ TreeSet超时 List+ PriorityQueue 超时

数组模拟+双指针 超时 最后发现是卡的输入输出

坑点:writer.flush 最后一次刷新输出写一次刷新一次只能过11个点

数组模拟+双指针 o(n) 版本如下

import java.util.Arrays;
import java.util.Scanner;
import java.io.*;
// hashset 数组 保证数据单一性的数组 查找元素快 (哈希表hashmap实现)
// treeset 数组 排序的数组 红黑树维护元素的顺序
// hashmap 
// treemap 排序 按照key 值排序 不按照value 红黑树
// 优先队列 ? + list ? || + hashmap ?
// sortedset
// java 的快速输入输出 
public class Main {
    public static void main(String[] args) throws Exception{
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
         int t = Integer.parseInt(reader.readLine());
        String desk;
        String s = null;
        int[][] desks = new int[2][500000 + 5];
        int[] other = new int[500000 + 5];        
            while (t != 0) {
                Arrays.fill(desks[0],0);
                Arrays.fill(desks[1],0);
                Arrays.fill(other,0);
                t--;
                int n;
                n = Integer.parseInt(reader.readLine());
                int x;
                desk = reader.readLine();
                int cnt1 = 0;
                int cnt0 = 0;
                for (int i = 1; i <= n; i++) {
                    x = Integer.parseInt(desk.charAt(i - 1) + "");
                    if (x != 2) {
//                      list.get(x).add(i);
                        if (x == 1) {
                            desks[1][cnt1++] = i;
                        } else {
                            desks[0][cnt0++] = i;
                        }
                    }
                }
                int m;
                m = Integer.parseInt(reader.readLine());
                s = reader.readLine();
                int to = s.length();
                int index1 = 0, index0 = 0;
                int indexother = 0;
                int cntother = 0;
                int ans = 0;
                for (int i = 0; i < to; i++) {
                    if (s.charAt(i) == 'M') {
                        if (other[indexother] != 0 || desks[1][index1] != 0) {
                            if (desks[1][index1] == 0) {
                                ans = other[indexother++];
                            } else if (other[indexother] == 0) {
                                ans = desks[1][index1++];
                            } else {
                                 if (desks[1][index1] < other[indexother]) {
                                     ans = desks[1][index1++];
                                  }  else {
                                      ans = other[indexother++];
                                  }                                
                            }
                        }else {
                            if (index0 != cnt0) {
                                other[cntother++] = desks[0][index0];
                                ans = desks[0][index0++];
                            } 
                        }
//                        System.out.println(ans);
                          writer.write(Integer.toString(ans));
                          writer.newLine();
                       //   writer.flush();
                      //    writer.newLine();
                    } else {
                        if (index0 != cnt0) {
                            other[cntother++] = desks[0][index0];
                            ans = desks[0][index0++];
                        } else {
                            if (other[indexother] != 0 || desks[1][index1] != 0) {
                                if (desks[1][index1] == 0) {
                                    ans = other[indexother++];
                                } else if (other[indexother] == 0) {
                                    ans = desks[1][index1++];
                                } else {
                                     if (desks[1][index1] < other[indexother]) {
                                         ans = desks[1][index1++];
                                      }  else {
                                          ans = other[indexother++];
                                      }
//                             
                                }
                            }
                        }
                        writer.write(Integer.toString(ans));
                        writer.newLine();
                       // writer.flush();
                       // writer.newLine();
                    }
                }
                writer.flush();
                // 优先队列 版本
                /*
                for (int i = 0; i < to; i++) {
                    if (s.charAt(i) == 'M') {
                        if (list.get(1).size() != 0) {
                            System.out.println(list.get(1).poll());
                        } else if (list.get(0).size() != 0) {
                            System.out.println(list.get(0).peek());
                            list.get(1).offer(list.get(0).poll());
                        }
                    } else {
                        if (list.get(0).size() != 0) {
                            System.out.println(list.get(0).peek());
                            list.get(1).offer(list.get(0).poll());
                        } else if (list.get(1).size() != 0) {
                            System.out.println(list.get(1).poll());
                        }
                    }
                }*/
        }
    }
}