atcoder: Moves on Binary Tree
先进行压缩move的次数,再用biginteger.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigInteger; import java.util.LinkedList; import java.util.List; public class Main { public static Object[] compact(String S) { LinkedList<String> sb = new LinkedList<>(); int unum = 0; char lastch = 'A'; for (int len = S.length(), i = len - 1; i >= 0;i--) { char ch = S.charAt(i); if (lastch == 'U') { if (ch == 'U') { unum++; } else if (ch != 'U' && unum > 0) { unum--; if (unum == 0) { sb.removeLast(); lastch = ch; } } else { lastch = ch; sb.addLast(""+ch); } } else { if (ch == 'U') { lastch = 'U'; unum = 1; sb.add(""+ch); } else { lastch = ch; sb.add(""+ch); } } } return new Object[]{sb,unum}; } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] words = reader.readLine().split(" "); int n = Integer.valueOf(words[0]); long x = Long.valueOf(words[1]); String S = reader.readLine(); Object[] obj = compact(S); LinkedList<String>list = (LinkedList<String>)obj[0]; int unum = (int) obj[1]; BigInteger ans = BigInteger.valueOf(x); for (int i = 0,len=list.size();i<len;i++) { char ch = list.pollLast().charAt(0); switch (ch) { case 'U': ans = ans.shiftRight(unum); break; case 'R': ans = ans.shiftLeft(1); ans = ans.add(BigInteger.ONE); break; case 'L': ans = ans.shiftLeft(1); break; default: break; } } System.out.println(ans); reader.close(); } }

浙公网安备 33010602011771号