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 C# (.NET Core 3.1.201) (judge verdict: Runtime Error)

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.Remoting;
using System.Security.Cryptography;
using System.Xml;

namespace Atcoder
{
    class Program
    {
        static void Main(string[] args)
        {
            var str = ReadLine().ToCharArray();

            while (Array.IndexOf(str, '?') >= 0) {
                var index = Array.IndexOf(str, '?');
                if(index >= 0) {
                    //最初の位置
                    if(index == 0) {
                        if(str[index + 1] == 'D') {
                            str[index] = 'P';
                        }
                        else {
                            str[index] = 'D';
                        }
                    //前も後ろもある
                    }else if(index > 0 && index < str.Length - 1) {
                        if (str[index - 1] == 'P') {
                            str[index] = 'D';
                        }
                        else {
                            str[index] = 'P';
                        }
                    }else if(index == str.Length - 1) {
                        if(str[index - 1] == 'P') {
                            str[index] = 'D';
                        }
                        else {
                            str[index] = 'P';
                        }
                    }
                }
            }

            var re = string.Empty;
            foreach (var item in str) {
                re += item;
            }
            Console.WriteLine(re);
        }

        //メモ

        //アルゴリズム

        //・全探索解

        /*
         * 例 [A, B, C]
         *
         *  A - B, A - C
         *  B - C
         * 
         *   for (int i = 0; i < n; i++) {
         *  
         *       for (int j = i + 1; j < n; j++) {
         *
         *           array[i], array[j]
         *
         *       }
         *   }
         */

        // ・配列の前後を見る

        /*
         *  例 array[1, 2, 3, 4, 5]
         *  
         *  r = 3;
         * 
         *  array[i - 1] => 1
         *  array[i] => 2
         *  array[i + 1] => 3
         * 
         * //範囲
         * int r = 3;
         * 
         * for(int i = 1; i <= array.Length - r; i++) { }
         * 
         */

        //配列 --------------------

        //降順
        //Array.Sort(h);
        //Array.Reverse(h);

        //合計値
        //array.Sum();

        //最大値
        //List.Sort(); List[Count() - 1] 

        //連続の整数配列を作成
        //
        // 1, 2, 3, 4, 5,..., n
        //var continuous = Enumerable.Range(1, n).ToList();

        //--------------------

        //切り捨て

        //double d = Math.Floor(n);

        //切り上げ

        //double d = Math.Celling(n);

        //kのn乗
        //(int) Math.Pow(k, n);

        //for文の逆
        //for(int i = array.Length - 1; i >= 0; i--) { }


        /// <summary>
        /// 最大公約数
        /// </summary>
        public static long Gcd(long a, long b)
        {
            while (true) {
                if (a < b) { long tmp = b; b = a; a = tmp; }
                if (a % b == 0) return b;
                var x = a;
                a = b;
                b = x % b;
            }
        }

        /// <summary>
        /// 最小公倍数
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static long Lcm(long a, long b) => a / Gcd(a, b) * b;

        /// <summary>
        /// コンビネーション
        /// </summary>
        static int nCm(int n, int m)
        {
            if (m == 0) return 1;
            if (n == 0) return 0;
            return n * nCm(n - 1, m - 1) / m;
        }

        /// <summary>
        /// 数字配列の重複をカウント
        /// </summary>
        public static int DistinctInt(IEnumerable<int> array)
        {
            var q = array.Distinct().Count();
            return array.Count() - q;
        }

        /// <summary>
        /// 文字配列の重複をカウント
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static int DistinctString(IEnumerable<string> array)
        {
            var q = array.Distinct().Count();
            return array.Count() - q;
        }


        public static string ReadLine() => Console.ReadLine();
        public static int ReadLineInt() => int.Parse(Console.ReadLine());
        public static long ReadLineLongInt() => long.Parse(Console.ReadLine());
        public static string[] ReadLineStringSplit(char a = ' ') => ReadLine().Split(a).ToArray();
        public static int[] ReadLineIntSpilit(char a = ' ') => ReadLine().Split(a).Select(x => int.Parse(x)).ToArray();
        public static long[] ReadLineLongSpilit(char a = ' ') => ReadLine().Split(a).Select(x => long.Parse(x)).ToArray();
        static string[] GetAlphaLowerArray() => new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
        static string[] GetAlphaUpperArray() => new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
    }
}