class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求出最终获胜帮派的名称
     * @param s string字符串 
     * @return string字符串
     */
    string predictVictory(string s) {
        // write code here
        int n = s.size();
        queue<int> r_queue, d_queue;// 存储R和D字符的索引
        for(int i=0; i < n; i++) {
            if(s[i] == 'R') r_queue.push(i);
            if(s[i] == 'D') d_queue.push(i);
        }
        while(1) {
            if(r_queue.empty() || d_queue.empty()) break; //若其中一方为空,直接退出,返回另一方成功
            int r_index = 0;
            int d_index = 0;
            r_index = r_queue.front();// 拿到red方当前队列的第一个索引值
            d_index = d_queue.front();// 拿到dark方当前队列的第一个索引值
            r_queue.pop();// 此pop可以认为是当前这个人的行动权结束或者是这个人被ban掉了
            d_queue.pop();// 如果是行动权结束,那他将会索引值+n再次插入到队列中,等下次循环到时再行动;但如果是ban掉,将不会再被插入到循环队列中
            
            if(r_index < d_index) {// r的索引比d的小,说明r先行动,r行驶ban权,ban掉其之后最近的d,而因为我们的r_queue和d_queue是对s遍历拿到的,所以d的队列首个索引就是r后最近的d
                r_queue.push(r_index + n);// r行驶ban权搬掉一个d后,自己的索引值+n,再次插入到队列后,循环使用,等待下一轮行动
            } else {
                d_queue.push(d_index + n);
            }
        }
        return !r_queue.empty()? "Red" : "Dark";//考虑极端的情况,一直是r在前,d在后,那么d都被ban掉,最后d没办法索引+n再次插入到队列中,d的队列最后将会变为空,此时,r胜利。
    }
};