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();
    }

}

 

posted @ 2022-03-12 23:01  fishcanfly  阅读(88)  评论(0)    收藏  举报
//雪花飘落效果