Problem:
Score : 200 points

Problem Statement

For a string S consisting of the uppercase English letters P and D, let the doctoral and postdoctoral quotient of S be the total number of occurrences of D and PD in S as contiguous substrings. For example, if S = PPDDP, it contains two occurrences of D and one occurrence of PD as contiguous substrings, so the doctoral and postdoctoral quotient of S is 3.

We have a string T consisting of P, D, and ?.

Among the strings that can be obtained by replacing each ? in T with P or D, find one with the maximum possible doctoral and postdoctoral quotient.

Constraints

1 \leq |T| \leq 2 \times 10^5

T consists of P, D, and ?.

Input

Input is given from Standard Input in the following format:

T

Output

Print one string with the maximum possible doctoral and postdoctoral quotient among the strings that can be obtained by replacing each ? in T with P or D.
If there are multiple such strings, you may print any of them.

Sample Input 1

PD?D??P

Sample Output 1

PDPDPDP

This string contains three occurrences of D and three occurrences of PD as contiguous substrings, so its doctoral and postdoctoral quotient is 6, which is the maximum doctoral and postdoctoral quotient of a string obtained by replacing each ? in T with P or D.

Sample Input 2

P?P?

Sample Output 2

PDPD

Solution in Java (OpenJDK 11.0.6) (judge verdict: Runtime Error)

import java.util.*;

class Main {

    public static void main(String[] args) throws Exception {

        String T;
        try (Scanner scanner = new Scanner(System.in)) {
            T = scanner.next();
        } catch (Exception e) {
            throw e;
        }

        class State {
            int index;
            String current;
            int count;
        }

        final ArrayDeque<State> states = new ArrayDeque<>();
        states.push(new State(){{
            index = -1;
            current = "";
            count = 0;
        }});

        int score = 0;
        String result = "";
        while (!states.isEmpty()) {
            final State state = states.pop();

            if (state.index+1 >= T.length()) continue;

            char[] charCandidates;
            if (T.charAt(state.index+1) == '?') {
                charCandidates = new char[]{'P', 'D'};
            } else {
                charCandidates = new char[]{T.charAt(state.index+1)};
            }

            for (char c: charCandidates) {
                State newState = new State(){{
                    index = state.index+1;
                    current = state.current+c;
                    count = state.count;
                    if (c == 'D') {
                        count++;
                    }
                    if (index >= 1 && state.current.charAt(index-1) == 'P' && c == 'D') {
                        count++;
                    }
                }};
                if (newState.count >= score && newState.current.length() == T.length()) {
                    result = newState.current;
                    score = newState.count;
                }
                states.push(newState);
            }
        }
        System.out.println(result);
    }
}