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 1.8.0) (judge verdict: Time Limit Exceeded)

import java.util.*;

class Main {

    static class State {
        int index;
        char currentChar;
        State previousState;
        int count;
    }

    static final char[] P_D = new char[]{'P', 'D'};
    static final char[] P = new char[]{'P'};
    static final char[] D = new char[]{'D'};

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

        int score = 0;
        State result = new State(){{
            index = -1;
            currentChar = 0;
            previousState = null;
            count = 0;
        }};
        final ArrayDeque<State> states = new ArrayDeque<>();
        states.push(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 = P_D;
            } else if (T.charAt(state.index+1) == 'P') {
                charCandidates = P;
            } else {
                charCandidates = D;
            }

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

        State current = result;
        List<Character> characters = new ArrayList<>();
        while (current.previousState != null) {
            characters.add(current.currentChar);
            current = current.previousState;
        }
        for (int i = characters.size()-1; i >= 0; i--) {
            System.out.write(characters.get(i));
        }
        System.out.flush();
    }
}