在遥远的相簿国有两个种族,分别是冬马族和雪菜族,每个人都属于这两个种族之一。如今,又到了选举元首的时候了,所有 n 个人排成一排等待投票。
相簿国的选举制度比较奇特,并不是看谁的票数多,而是使用一票否决制度,并且所有人都可以投一张票或者不投票。如果排在前面的人把排在后面的人一票否决了,那么后面的人不能参与竞选,也不能投出他的那一票了。而如果排在后面的人把排在前面的人一票否决了,那么排在前面的人不能参与竞选,但是已经投出的那一票仍然有效。如果一轮投完仍然有不只一个竞选者,那么这些留下的人再投一轮,还没有停止就再投一轮……直到剩下一人为止,但投票的先后顺序不变。
为了保证每轮投票中都有更多人可以投票,规定竞选者优先投票给在他投票时已经投过票的异族人,每轮投票结束时重置竞选人的投票状态。
所有人都希望自己族的人能当选元首(而不是希望自己当元首),并且会为此采取最优策略。现在给出排队中每个人的种族,请问最后是哪个种族的人会当选元首?
输入
输入第一行一个数 n ,表示相簿国里的人数。
第二行一个长度为 n 的字符串 s ,从前到后依次表示排队投票的人所属的种族。D 表示冬马族,而 X 表示雪菜族。
输出
输出一个字符 D 或 X ,表示是哪一族的人当选。
注意
数据保证1<=n <=200000。
测试用例
用例1.
输入:
5↵
DDXXX↵
输出:
D↵
用例2.
输入:
6↵
DDXXXX↵
输出:
X↵
样例
输入(1)
5
DDXXX
输出(1)
D
输入(2)
6
DDXXXX
输出(2)
X
代码
#include <iostream>
#include <stack>
using namespace std;
int main() {
int n;
string s;
stack<char> st; // Stack to store candidates with voting rights
int D = 0, X = 0; // Count of voting rights for each tribe
char last; // To store the last candidate
cin >> n;
cin >> s;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'D') {
if (X == 0) {
if (st.empty() || st.top() == 'D') {
st.push('D');
D++;
} else {
st.pop();
int num = 1;
while (i < n - 1 && s[i + 1] == 'D' && !st.empty() && st.top() == 'X') {
i++;
st.pop();
num++;
}
while (num--) {
st.push('D');
}
}
} else {
X--;
}
} else if (s[i] == 'X') {
if (D == 0) {
if (st.empty() || st.top() == 'X') {
st.push('X');
X++;
} else {
st.pop();
int num = 1;
while (i < s.size() - 1 && s[i + 1] == 'X' && !st.empty() && st.top() == 'D') {
i++;
st.pop();
num++;
}
while (num--) {
st.push('X');
}
}
} else {
D--;
}
}
}
int D1 = 0, X1 = 0;
while (!st.empty()) {
if (st.size() == 1) last = st.top();
if (st.top() == 'D') D1++;
else X1++;
st.pop();
}
if (D1 > X1) cout << 'D' << endl;
else if (X1 > D1) cout << 'X' << endl;
else cout << last << endl;
return 0;
}