记录
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <climits>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
int n, m;
struct pig{
int hp, cnt, zhuge;
char type, stype;
char a[10010];
}a[15];
char card[10010], cardcnt;
void init_(){
cin >> n >> m;
for (int i = 1; i <= n; i++){
a[i].hp = 4, a[i].cnt = 4, a[i].zhuge = 0;
cin >> a[i].type >> a[i].a[1];
cin >> a[i].a[1] >> a[i].a[2] >> a[i].a[3] >> a[i].a[4];
if (a[i].type == 'M') a[i].stype = 'M';
}
for (int i = 1; i <= m; i++){
cin >> card[i];
}
}
void getcard(int i){
a[i].cnt++;
if (cardcnt < m) cardcnt++;
a[i].a[a[i].cnt] = card[cardcnt];
}
void flatten(int i, int j){
for (; j < a[i].cnt; j++){
a[i].a[j] = a[i].a[j + 1];
}
a[i].cnt--;
}
int nxt(int i){
do{
i = i % n + 1;
} while (!a[i].hp);
return i;
}
int findc(int i, char t){
for (int j = 1; j <= a[i].cnt; j++){
if (a[i].a[j] == t) return i;
}
return -1;
}
bool is_end(){
int M = 0, Z = 0, F = 0;
for (int i = 1; i <= n; i++){
if (a[i].hp){
if (a[i].type == 'M') M++;
else if (a[i].type == 'Z') Z++;
else if (a[i].type == 'F') F++;
}
}
if (M == 0 || F == 0) return 1;
}
bool check_end(){
int M = 0, Z = 0, F = 0;
for (int i = 1; i <= n; i++){
if (a[i].hp){
if (a[i].type == 'M') M++;
else if (a[i].type == 'Z') Z++;
else if (a[i].type == 'F') F++;
}
}
if (M == 0) return 0;
if (F == 0) return 1;
return 0;
}
bool do_dead(int k, int i){
if (a[i].hp <= 0){
int ip;
while (a[i].hp <= 0 && (ip = findc(i, 'P')) && ip != -1){
flatten(i, ip);
a[i].hp++;
}
if (a[i].hp <= 0){
if (is_end()) return 1;
if (a[i].type == 'F'){
getcard(k); getcard(k); getcard(k);
}
else if (a[k].type == 'M' && a[i].type == 'Z'){
a[k].zhuge = 0;
memset(a[i].a, 0, sizeof(a[i].a));
}
return 0;
}
}
return 0;
}
void use_p(int i, int j){
a[i].hp++;
flatten(i, j);
}
int use_k(int i, int j){
int ni = nxt(i);
if (a[i].type == 'M'){
if (a[ni].stype == 'L' || a[ni].stype == 'F'){
flatten(i, j);
int shan = findc(ni, 'D');
if (shan != -1){
flatten(ni, shan);
}
else{
a[ni].hp--;
return do_dead(i, ni);
}
}
}
else if (a[i].type == 'Z'){
if (a[ni].stype == 'F'){
flatten(i, j);
a[i].stype = 'Z';
int shan = findc(ni, 'D');
if (shan != -1){
flatten(ni, shan);
}
else{
a[ni].hp--;
return do_dead(i, ni);
}
}
}
else {
if (a[ni].stype == 'M' || a[ni].stype == 'Z'){
flatten(i, j);
a[i].stype = 'F';
int shan = findc(ni, 'D');
if (shan != -1){
flatten(ni, shan);
}
else{
a[ni].hp--;
return do_dead(i, ni);
}
}
}
return -1;
}
void use_z(int i, int j){
flatten(i, j);
a[i].zhuge = 1;
}
bool usecard(int i){
char now;
bool usek = 0;
for (int j = 1; j <= a[i].cnt; j++){
now = a[i].a[j];
bool useflag = 0;
switch (now){
case 'P':
if (a[i].hp < 4){
useflag = 1;
use_p(i, j);
}
break;
case 'K':
if (a[i].zhuge || !usek){
int ret = use_k(i, j);
if (ret == 1) return 1;
else if (ret == 0){
usek = 1;
useflag = 1;
}
}
break;
case 'Z':
if (a[i].zhuge == 0) useflag = 1;
use_z(i, j);
break;
}
if (useflag) j = 0;
}
return 0;
}
bool play(int i){
getcard(i); getcard(i);
return usecard(i);
}
void start(){
for (int i = 1; is_end(); i = nxt(i)){
if (play(i)) break;
}
}
void print(){
cout << (check_end() ? "MP\n" : "FP\n");
for (int i = 1; i <= n; i++){
if (a[i].hp <= 0) cout << "DEAD\n";
else {
for (int j = 1; j <= a[i].cnt; j++){
cout << a[i].a[j] << (j == a[i].cnt ? "" : " ");
}
cout << (i == n ? "" : "\n");
}
}
}
int main(){
init_();
start();
print();
return 0;
}