SETNJA - Setnja

Tags: bignum, brute-force, dp

Problem

https://vn.spoj.com/problems/SETNJA

https://oj.vnoi.info/problem/SETNJA

Trong một cây nhị phân vô hạn:

  • Mỗi nút có đúng 2 con – một con trái và một con phải.
  • Nếu một nút được gán nhãn bằng số nguyên X, thì con trái của nó được gán nhãn 2*X và con phải của nó được gán nhãn 2*X+1.
  • Gốc của cây được gán nhãn 1.

Một cuộc dạo chơi trên cây nhị phân bắt đầu từ gốc. Tại mỗi bước, ta sẽ nhảy tới con trái hoặc con phải của nút hiện thời, hoặc là dừng lại tại chính nút đó để nghỉ.

Một cuộc dạo chơi được mô tả bằng một chuỗi các chữ cái L, RP:

  • L thể hiện bước nhảy tới con trái;
  • R thể hiện bước nhảy tới con phải;
  • P thể hiện việc dừng để nghỉ.

Giá trị của một cuộc dạo chơi là nhãn của nút mà chúng ta kết thúc. Ví dụ, giá trị của cuộc dạo chơi LR là 5, trong khi giá trị của cuộc dạo chơi RPP là 3.

Một tập hợp các cuộc dạo chơi được mô tả bởi một chuỗi các kí tự L, R, P*. Mỗi dấu * có thể là một trong 3 cách di chuyển; tập hợp các cuộc dạo chơi chứa tất cả các cuộc dạo chơi thích hợp với khuôn mẫu đó.

Ví dụ, tập hợp L*R chứa các cuộc dạo chơi LLR, LRRLPR. Tập hợp ** chứa các cuộc dạo chơi LL, LR, LP, RL, RR, RP, PL, PRPP.

Cuối cùng, giá trị của một tập hợp các cuộc dạo chơi đúng bằng tổng các giá trị của tất cả các cuộc dạo chơi trong tập hợp đó.

Tính giá trị của một tập hợp các cuộc dạo chơi cho trước.

Input

Một chuỗi mô tả tập hợp. Chỉ có các kí tự L, R, P and * xuất hiện trong chuỗi, và có nhiều nhất 10000 kí tự.

Output

Ghi giá trị của tập hợp đó.

Example

Input
L*R

Output
25

Tutorial

Gọi F[i] là tổng cần tìm đến vị trí thứ i, nhận xét một chút:

Nếu kí tự thứ iP thì chỉ đơn giản F[i] = F[i-1].

Nếu kí tự thứ iL thì chỉ việc : F[i] = 2F[i-1].

Chi có trường hợp kí tự thứ iR với * là cần xử lí đặc biệt. Nhìn vào hình vẽ trên ta có thể thấy. Khi là R thì theo nguyên tắc tổng các nhánh bằng 2 lần nhánh trước đó cộng 1, hay nói cách khác là 2F[i-1] cộng với số nhánh hiện tại. Tương tự như vậy, khi là * thì mỗi nhánh x[i] sẽ bằng 3 trường hợp khi nó là P L R, tức là x[i-1], 2x[i-1], 2x[i-1]+1, tức là 5x[i-1]+1, mà cộng các nhánh lại tức là 5F[i-1] + số nhánh hiện tại.

Còn tính số nhánh, nhìn vào hình vẽ thì số nhánh chỉ tạo ra khi gặp *, tức là chỉ tạo mọt biến cnt, khi gặp * thì cnt *= 3.

Do N lớn nên cài số lớn cho bài toán này. Nhưng thời gian khá chặt nên dùng Java cho chắc chắn ko TLE ☺. (tại mình cài C++ bị TLE ☺)


Submission

SETNJA.java