双指针
最后一个无法通过 卡输出

StringBuilder sb = new StringBuilder();
sb.append(输出的字符串)
System.out.print(sb);
要比println 输出效率高太多

import java.io.*;

import java.util.Scanner;
import java.util.*;


public class Main{


    public static void main(String[] args) {



        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        int t = sc.nextInt();

        for(int k=0;k<t;k++){
            int n = sc.nextInt();
            sc.nextLine();
            // 每桌的人数 table
            int[] table = new int[n];
            String table_char = sc.nextLine();
            for(int i=0;i<n;i++){
                table[i] = table_char.charAt(i)-'0';
            }
            int m = sc.nextInt();
            sc.nextLine();
            //排队 序列 que
            String que = sc.nextLine();

            int pointM = 0; //指向1座位
            int pointF = 0; //指向0座位

            for(int i=0;i<m;i++){
                if (que.charAt(i) == 'F'){
                    //寻找0,1座位
                    while(pointF<n && table[pointF]!=0 ) pointF++;
                    while(pointM < n && table[pointM]!=1) pointM++;
                    //没有0座位
                    if(pointF >= n) {
                        table[pointM]++;
                        System.out.println(pointM+1);
                    }
                    //有0座位
                    else {
                        System.out.println(pointF+1);
                        table[pointF]++;
                        pointM = Math.min(pointM,pointF);
                    }
                }else{
                    //寻找0,1座位
                    while(pointM < n && table[pointM]!=1) pointM++;
                    while(pointF<n && table[pointF]!=0 ) pointF++;
                    //没有一个人的
                    if(pointM >= n) {
                        System.out.println(pointF+1);
                        table[pointF]++;
                        pointM = Math.min(pointM,pointF); //这里是取最小的 女性会增加1个座位的
                        //有1座位的
                    }else {
                        System.out.println(pointM+1);
                        table[pointM]++;
                    }
                }
            }
        }
    }
}

卡输出 每次 println 太费时间 输出改成buffer


import java.util.Scanner;
import java.util.*;
import java.io.*;


public class Main{


    public static void main(String[] args) {


        Scanner sc = new Scanner(new BufferedInputStream(System.in));

        int t = sc.nextInt();

        for(int k=0;k<t;k++){
            int n = sc.nextInt();
            sc.nextLine();
            // 每桌的人数 table
            int[] table = new int[n];
            String table_char = sc.nextLine();
            for(int i=0;i<n;i++){
                table[i] = table_char.charAt(i)-'0';
            }
            int m = sc.nextInt();
            sc.nextLine();
            //排队 序列 que
            String que = sc.nextLine();



            int pointM = 0; //指向1座位
            int pointF = 0; //指向0座位

            // 修改输出
            StringBuilder sb = new StringBuilder();

            for(int i=0;i<m;i++){
                int seatsnum;
                if (que.charAt(i) == 'F'){
                    //寻找0座位
                    while(pointF<n && table[pointF]!=0 ) pointF++;
                    //没有0座位
                    if(pointF >= n) {
                        while(pointM < n && table[pointM]!=1) pointM++;
                        table[pointM]++;
                        seatsnum = pointM+1;
                    }
                    //有0座位
                    else {
                        seatsnum = pointF+1;
                        table[pointF]++;
                        pointM = Math.min(pointM,pointF);
                    }
                }else{
                    //寻找1座位
                    while(pointM < n && table[pointM]!=1) pointM++;
                    //没有一个人的
                    if(pointM >= n) {
                        while(pointF<n && table[pointF]!=0 ) pointF++;
                        seatsnum = pointF+1;
                        table[pointF]++;
                        pointM = Math.min(pointM,pointF);
                        //有1座位的
                    }else {
                        seatsnum = pointM+1;
                        table[pointM]++;
                    }
                }
                sb.append(seatsnum).append("\n");
            }
            System.out.print(sb);
        }
    }
}