样例不过555。
#include <bits/stdc++.h>
#define auto list<char>::iterator
using namespace std;
int n, m;
int cnt_fp;
/*
基本牌:
桃:P
杀:K
闪:D
锦囊牌:
决斗:F
南猪入侵:N
万箭齐发:W
无懈可击:J
装备牌:
猪哥连弩:Z
*/
struct Pig {
string type;
/*
猪种
主猪:MP
忠猪:ZP
反猪:FP
*/
list<char> cards;//手中卡牌
bool show_type;//是否跳了身份
bool dead;//是否死亡
bool like_bad;//是否是类反猪
bool armed;//是否装备猪哥连弩
int hp;//血量
} pigs[11];
list<char> cards_heap;//全局卡牌
/*<============下面是一堆令人毛骨悚然的函数……================>*/
inline void init();
inline bool game_over();
inline void print();
inline void stage1();
inline void stage2();
inline void mp(int);
inline void zp(int);
inline void fp(int);
inline void eat_peach(int id);
inline bool tips(char, int, int);
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
init();
while (true) {
stage1();
stage2();
}
return 0;
}
inline void init() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> pigs[i].type;
if (pigs[i].type == "FP")
cnt_fp++;
pigs[i].cards.clear();
pigs[i].show_type = false;
pigs[i].dead = false;
pigs[i].like_bad = false;
pigs[i].armed = false;
pigs[i].hp = 4;
for (int j = 0; j < 4; j++) {
char card;
cin >> card;
pigs[i].cards.push_back(card);
}
}
for (int i = 1; i <= m; i++) {
char card;
cin >> card;
cards_heap.push_back(card);
}
}
inline bool game_over() {
return pigs[1].dead || cnt_fp == 0;
}
inline void print() {
if (cnt_fp)
cout << "FP" << endl;
else
cout << "MP" << endl;
for (int i = 1; i <= n; i++) {
if (pigs[i].dead)
cout << "DEAD" << endl;
while (!pigs[i].cards.empty()) {
cout << pigs[i].cards.front();
pigs[i].cards.pop_front();
}
}
exit(0);
}
inline void stage1() {
for (int i = 1; i <= n; i++)
if (!pigs[i].dead)//死猪不用摸牌!!!
for (int j = 1; j <= 2; j++) {
char card = cards_heap.front();
if (cards_heap.size() > 1)
cards_heap.pop_front();
if (card == 'Z')
pigs[i].armed = true;
else
pigs[i].cards.push_back(card);
}
}
inline void stage2() {
for (int i = 1; i <= n; i++) {
if (pigs[i].dead)//猪都死了还费啥劲
continue;
if (pigs[i].type == "MP")
mp(i);
else if (pigs[i].type == "ZP")
zp(i);
else
fp(i);
}
}
inline void mp(int id) {
auto card = pigs[id].cards.begin();
bool used_kill = false;
pigs[id].show_type = true;
while (card != pigs[id].cards.end()) {
if (pigs[id].dead)//死了,送葬吧
print();
if (*card == 'P')//吃桃
if (pigs[id].hp != 4) {
pigs[id].hp++;
auto peach = card;
card++;
pigs[id].cards.erase(peach);
}
else if (*card == 'K') {//杀!
if (used_kill && !pigs[id].armed)//不能再杀了
continue;
used_kill = true;
int k = id + 1;
while (pigs[k].dead) {//找可以攻击的目标
k++;
if (k > n)
k = 1;
}
if ((pigs[k].show_type && pigs[k].type == "FP") || pigs[k].like_bad) {//有问题
bool flag = true;
auto kc = pigs[k].cards.begin();
while (kc != pigs[k].cards.end()) {//能闪吗
if (*kc == 'D') {
flag = false;
pigs[k].cards.erase(kc);
break;
}
kc++;
}
if (flag) {//不能闪
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
if (pigs[k].type == "FP") {
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
} else//卧活,丢牌吧
pigs[id].cards.clear(), pigs[id].armed = false;
}
}
}
}
} else if (*card == 'F') {//Fight!
int k = id + 1;
while (pigs[k].dead ||
(pigs[id].show_type && pigs[id].type == "ZP") ||
!pigs[id].like_bad) {//找第一个可以表敌意的目标
k++;
if (k > n)
k = 1;
}
if (tips('F', id, k)) {
auto tc = pigs[k].cards.begin();
auto fc = pigs[id].cards.begin();
bool win_or_lose;
if (pigs[k].type != "ZP")
while (true) {
while (*tc != 'K' && tc != pigs[k].cards.end())
tc++;
if (tc == pigs[k].cards.end()) {//决斗胜利
win_or_lose = true;
break;
}
while (*fc != 'K' && fc != pigs[id].cards.end())
fc++;
if (fc == pigs[id].cards.end()) {//决斗失败
win_or_lose = false;
break;
}
}
else
win_or_lose = true;
if (win_or_lose) {//决斗胜利!!!
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
if (pigs[k].type == "FP") {
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
} else//卧活,丢牌吧
pigs[id].cards.clear(), pigs[id].armed = false;
}
} else {
pigs[id].hp--;//我方扣血
card = pigs[id].cards.begin();//赶紧吃前面的桃子
if (pigs[id].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[id].hp <= 0)//完辣!主猪驾崩辣!!!
pigs[id].dead = true, print();
}
}
}
}
} else if (*card == 'N') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (pigs[k].dead) {//死猪别管
k++;
if (k > n)
k = 1;
continue;
}
if (tips('N', id, k)) {
auto kc = pigs[k].cards.begin();
bool flag = false;
while (kc != pigs[k].cards.end()) {
if (*kc == 'K') {
flag = true;
break;
}
}
if (flag)//有杀
pigs[k].cards.erase(kc);
else {//没杀
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
if (pigs[k].type == "FP") {
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
} else//卧活,丢牌吧
pigs[id].cards.clear(), pigs[id].armed = false;
}
}
}
}
}
} else if (*card == 'W') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (pigs[k].dead) {//死猪别管
k++;
if (k > n)
k = 1;
continue;
}
if (tips('N', id, k)) {
auto kc = pigs[k].cards.begin();
bool flag = false;
while (kc != pigs[k].cards.end()) {
if (*kc == 'D') {
flag = true;
break;
}
}
if (flag)//有闪
pigs[k].cards.erase(kc);
else {//没闪
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
if (pigs[k].type == "FP") {
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
} else//卧活,丢牌吧
pigs[id].cards.clear(), pigs[id].armed = false;
}
}
}
}
}
}
auto na = card;
card++;
pigs[id].cards.erase(na);
}
}
inline void zp(int id) {
auto card = pigs[id].cards.begin();
bool used_kill = false;
while (card != pigs[id].cards.end()) {
if (pigs[id].dead)//死了,送葬吧
print();
if (*card == 'P')//吃桃
if (pigs[id].hp != 4) {
pigs[id].hp++;
auto peach = card;
card++;
pigs[id].cards.erase(peach);
}
else if (*card == 'K') {//杀!
if (used_kill && !pigs[id].armed)//不能再杀了
continue;
used_kill = true;
int k = id + 1;
while (pigs[k].dead) {//找可以攻击的目标
k++;
if (k > n)
k = 1;
}
if (pigs[k].show_type && (pigs[k].type == "ZP" || pigs[k].type == "MP")) {//有问题
pigs[id].show_type = true;
bool flag = true;
auto kc = pigs[k].cards.begin();
while (kc != pigs[k].cards.end()) {//能闪吗
if (*kc == 'D') {
flag = false;
pigs[k].cards.erase(kc);
break;
}
kc++;
}
if (flag) {//不能闪
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
}
}
}
} else if (*card == 'F') {//Fight!
int k = id + 1;
while (pigs[k].dead || pigs[id].show_type && pigs[id].type == "ZP") {//找第一个可以表敌意的目标
k++;
if (k > n)
k = 1;
}
if (tips('F', id, k)) {
pigs[id].show_type = true;
auto tc = pigs[k].cards.begin();
auto fc = pigs[id].cards.begin();
bool win_or_lose;
if (pigs[k].type != "MP")
while (true) {
while (*tc != 'K' && tc != pigs[k].cards.end())
tc++;
if (tc == pigs[k].cards.end()) {//决斗胜利
win_or_lose = true;
break;
}
while (*fc != 'K' && fc != pigs[id].cards.end())
fc++;
if (fc == pigs[id].cards.end()) {//决斗失败
win_or_lose = false;
break;
}
}
else
win_or_lose = false;
if (win_or_lose) {//决斗胜利!!!
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
} else {
pigs[id].hp--;//我方扣血
card = pigs[id].cards.begin();//赶紧吃前面的桃子
if (pigs[id].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[id].hp <= 0) {//忠猪死辣!!!
pigs[id].dead = true;
return;
}
}
}
}
}
} else if (*card == 'N') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (pigs[k].dead) {//死猪别管
k++;
if (k > n)
k = 1;
continue;
}
if (tips('N', id, k)) {
auto kc = pigs[k].cards.begin();
bool flag = false;
while (kc != pigs[k].cards.end()) {
if (*kc == 'K') {
flag = true;
break;
}
}
if (flag)//有杀
pigs[k].cards.erase(kc);
else {//没杀
pigs[k].hp--;//扣血
if (pigs[k].type == "MP")
pigs[k].like_bad = true;
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
}
}
}
}
} else if (*card == 'W') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (pigs[k].dead) {//死猪别管
k++;
if (k > n)
k = 1;
continue;
}
if (tips('N', id, k)) {
auto kc = pigs[k].cards.begin();
bool flag = false;
while (kc != pigs[k].cards.end()) {
if (*kc == 'D') {
flag = true;
break;
}
}
if (flag)//有闪
pigs[k].cards.erase(kc);
else {//没闪
if (pigs[k].type == "MP")
pigs[k].like_bad = true;
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
}
}
}
}
}
auto na = card;
card++;
pigs[id].cards.erase(na);
}
}
inline void fp(int id) {
auto card = pigs[id].cards.begin();
bool used_kill = false;
while (card != pigs[id].cards.end()) {
if (pigs[id].dead)//死了,送葬吧
print();
if (*card == 'P')//吃桃
if (pigs[id].hp != 4) {
pigs[id].hp++;
auto peach = card;
card++;
pigs[id].cards.erase(peach);
}
else if (*card == 'K') {//杀!
if (used_kill && !pigs[id].armed)//不能再杀了
continue;
used_kill = true;
int k = id + 1;
while (pigs[k].dead) {//找可以攻击的目标
k++;
if (k > n)
k = 1;
}
if (pigs[k].show_type && (pigs[k].type == "ZP" || pigs[k].type == "MP")) {//有问题
pigs[id].show_type = true;
bool flag = true;
auto kc = pigs[k].cards.begin();
while (kc != pigs[k].cards.end()) {//能闪吗
if (*kc == 'D') {
flag = false;
pigs[k].cards.erase(kc);
break;
}
kc++;
}
if (flag) {//不能闪
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
}
}
}
} else if (*card == 'F') {//Fight!
int k = 1;
if (tips('F', id, k)) {
pigs[id].show_type = true;
auto tc = pigs[k].cards.begin();
auto fc = pigs[id].cards.begin();
bool win_or_lose;
while (true) {
while (*tc != 'K' && tc != pigs[k].cards.end())
tc++;
if (tc == pigs[k].cards.end()) {//决斗胜利
win_or_lose = true;
break;
}
while (*fc != 'K' && fc != pigs[id].cards.end())
fc++;
if (fc == pigs[id].cards.end()) {//决斗失败
win_or_lose = false;
break;
}
}
if (win_or_lose) {//决斗胜利!!!
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
} else {
pigs[id].hp--;//我方扣血
card = pigs[id].cards.begin();//赶紧吃前面的桃子
if (pigs[id].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[id].hp <= 0) {//反猪死辣!!!
pigs[id].dead = true;
if (game_over())
print();
return;
}
}
}
}
}
} else if (*card == 'N') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (pigs[k].dead) {//死猪别管
k++;
if (k > n)
k = 1;
continue;
}
if (tips('N', id, k)) {
auto kc = pigs[k].cards.begin();
bool flag = false;
while (kc != pigs[k].cards.end()) {
if (*kc == 'K') {
flag = true;
break;
}
}
if (flag)//有杀
pigs[k].cards.erase(kc);
else {//没杀
pigs[k].hp--;//扣血
if (pigs[k].type == "MP")
pigs[k].like_bad = true;
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
}
}
}
}
} else if (*card == 'W') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (pigs[k].dead) {//死猪别管
k++;
if (k > n)
k = 1;
continue;
}
if (tips('N', id, k)) {
auto kc = pigs[k].cards.begin();
bool flag = false;
while (kc != pigs[k].cards.end()) {
if (*kc == 'D') {
flag = true;
break;
}
}
if (flag)//有闪
pigs[k].cards.erase(kc);
else {//没闪
if (pigs[k].type == "MP")
pigs[k].like_bad = true;
pigs[k].hp--;//扣血
if (pigs[k].hp <= 0) {
eat_peach(k);//吃桃补充体力!!!
if (pigs[k].hp <= 0) {
pigs[k].dead = true;//死啦
cnt_fp--;
if (game_over())
print();
for (int i = 1; i <= 3; i++) {//摸三张牌!
char mc = cards_heap.front();
if (mc == 'Z')//有猪哥连弩辣!前面的Kill能用了!
pigs[id].armed = true, card = pigs[id].cards.begin();
else//不是猪哥连弩
pigs[id].cards.push_back(mc);
cards_heap.pop_front();
}
}
}
}
}
}
}
auto na = card;
card++;
pigs[id].cards.erase(na);
}
}
inline void eat_peach(int id) {
auto card = pigs[id].cards.begin();
while (card != pigs[id].cards.end())
if (*card == 'P') {//吃桃
if (pigs[id].hp <= 0) {
pigs[id].hp++;
auto peach = card;
card++;
pigs[id].cards.erase(peach);
} else
return;
} else
card++;
}
inline bool tips(char card, int id, int t) {
if (card == 'F' || card == 'N' || card == 'W') {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (
((pigs[t].type == "MP" && pigs[k].type == "ZP") || (pigs[t].type == "ZP" && pigs[k].type == "MP") || (pigs[t].type == pigs[k].type)) && pigs[t].show_type) {//我帮你!!!
auto kc = pigs[k].cards.begin();
bool flag = false;//我先找一下无懈在哪儿^o^
while (kc != pigs[k].cards.end()) {
if (*kc == 'J') {//OK找到了^o^!
flag = true;
pigs[k].cards.erase(kc);
break;
}
kc++;
}
if (flag) {
flag = !tips('J', k, t);
if (flag)
pigs[k].show_type = true;//跳身份
return flag;
}
}
k++;
if (k > n)
k = 1;
}
} else {
int k = id + 1;
if (k > n)
k = 1;
while (k != id) {
if (((pigs[t].type == "MP" && pigs[k].type == "FP") || (pigs[t].type == "ZP" && pigs[k].type == "FP")) && pigs[t].show_type) {//我无懈你的无懈!!!
auto kc = pigs[k].cards.begin();
bool flag = false;//我先找一下无懈在哪儿…
while (kc != pigs[k].cards.end()) {
if (*kc == 'J') {//OK找到了^o^!
flag = true;
pigs[k].cards.erase(kc);
break;
}
kc++;
}
if (flag) {
flag = !tips('J', k, t);
if (flag)
pigs[k].show_type = true;//跳身份
return flag;
}
}
k++;
if (k > n)
k = 1;
}
}
return true;//没人愿意打无懈!
}