rt
#include<bits/stdc++.h>
using namespace std;
struct pig{string name,s;int b,p,nt,lt;bool mp,zp;}a[11];
int n,m,fb,hp,fd;
string __;
//print()&x_y()用来检查。
void print(){//输出战局。
cout<<"目前局势:\n";
for(int i=0;i<n;i++){
cout<<a[i].name<<' '<<a[i].b<<' ';
if(a[i].b<1)cout<<"DEAD\n";
else{
for(int j=0;j<a[i].s.size();j++)cout<<a[i].s[j];
cout<<endl;
}
}cout<<"牌堆:";
for(int i=0;i<__.size();i++)cout<<__[i];
cout<<endl;
return;
}
void x_y(int x,int y,string z){//x对y使用了z。
cout<<x<<a[x].name<<"对"<<y<<a[y].name<<"使用了:"<<z<<endl;
print();
return;
}
void pc(int x,int i){//摸牌。
while(i--){
a[x].s+=__.substr(0,2);
if(__.size()-2)__.erase(0,2);
}return;
}
void P(int x){//桃。
int i=a[x].s.find("P ");
while(i<a[x].s.size()&&a[x].b<4)a[x].s.erase(i,2),a[x].b++,i=a[x].s.find("P ");
return;
}
bool die(int x,int y){//死了?
if(a[y].b>0)return 0;
P(y);
if(a[y].b>0)return 0;
a[a[y].lt].nt=a[y].nt,a[a[y].nt].lt=a[y].lt,hp--;
if(a[y].name=="FP")pc(x,3),fd++;
else if(a[x].name=="MP"&&a[y].name=="ZP")a[x].s.erase(0);
return 1;
}
int D(int x){//闪。
int i=a[x].s.find("D ");
if(i>=a[x].s.size())return 1;
a[x].s.erase(i,2);
return 0;
}
bool K(int x){//出杀。
int i=a[x].s.find("K ");
if(i>=a[x].s.size())return 1;
a[x].s.erase(i,2);
return 0;
}
void K_p(int x,int y){//杀人。
while(!K(x)){
a[y].b-=D(y);
if(!y)a[y].mp=1;
if(die(x,y))return;
if(!a[x].zp)break;
}return;
}
bool J(int x){//无懈可击。
int i=a[x].s.find("J ");
if(i>=a[x].s.size())return 0;
a[x].s.erase(i,2);
return 1;
}
bool ok(int x){//献殷勤。
if(a[x].p==-1)return 0;
if(!a[x].p){
for(int i=0,j=0;j<hp;j++,i=a[i].nt){
if(a[i].name=="FP"&&J(i)){
a[i].p=0;
return 1;
}
}return 0;
}for(int i=0,j=0;j<hp;j++,i=a[i].nt){
if((a[i].name=="MP"||a[i].name=="ZP")&&J(i)){
a[i].p=1,a[i].mp=0;
return 1;
}
}return 0;
}
void F(int x,int y){//决斗。
if(a[x].name=="MP"&&a[y].name=="ZP"){
a[y].b--;
return;
}if(ok(y))return;
while(1){
if(K(y)){
a[y].b--,die(x,y);
return;
}if(K(x)){
a[x].b--,die(y,x);
return;
}
}return;
}
void N(int x){//南猪入侵。
for(int i=0,j=0;j<hp;j++,i=a[i].nt){
if(ok(i)||!K(i)||i==x)continue;
if(!i&&a[x].p==-1)a[x].mp=1;
a[i].b--,die(x,i);
}return;
}
void W(int x){//万箭齐发。
for(int i=0,j=0;j<hp;j++,i=a[i].nt){
if(ok(i)||!D(i))continue;
if(!i&&a[x].p==-1)a[x].mp=1;
a[i].b--,die(x,i);
}return;
}
void N_or_W(int x){//有没有上面两个。
int i=a[x].s.find("N ");
while(i<a[x].s.size())a[x].s.erase(i,2),N(x),i=a[x].s.find("N ");
i=a[x].s.find("W ");
while(i<a[x].s.size())a[x].s.erase(i,2),W(x),i=a[x].s.find("W ");
return;
}
void pk(int x,int y){//表敌意。
K_p(x,y);
int i=a[x].s.find("F ");
while(i<a[x].s.size()&&a[y].b>0)a[x].s.erase(i,2),F(x,y),i=a[x].s.find("F ");
return;
}
void pZ(int x){//装备。
int i=a[x].s.find("Z ");
while(i<a[x].s.size())a[x].s.erase(i,2),a[x].zp=1,i=a[x].s.find("Z ");
return;
}
void ed(){//结局。
cout<<(a[0].b>0?"MP\n":"FP\n");
for(int i=0;i<n;i++){
if(a[i].b<1)cout<<"DEAD\n";
else{
for(int j=0;j<a[i].s.size();j++)
if(a[i].s[j]!=' ')cout<<a[i].s[j]<<' ';
cout<<endl;
}
}return;
}
void game(){//游戏。
while(1){
for(int i=0,j=0;j<hp;j++,i=a[i].nt){
pc(i,2),P(i),pZ(i);//摸牌,吃桃,装备。
if(!i){//主猪出牌。
N_or_W(i);
if(a[a[i].nt].mp||!a[a[i].nt].p){
pk(i,a[i].nt);
die(i,a[i].nt);
}else if(a[a[i].lt].mp||!a[a[i].lt].p){
pk(i,a[i].lt);
die(i,a[i].lt);
}
}
else if(a[i].name=="ZP"){//忠猪出牌。
N_or_W(i);
if(!a[a[i].nt].p){
pk(i,a[i].nt);
die(i,a[i].nt);
}else if(!a[a[i].lt].p){
pk(i,a[i].lt);
die(i,a[i].lt);
}
}
else{//反猪出牌。
N_or_W(i);
if(a[a[i].nt].p){
pk(i,a[i].nt);
die(i,a[i].nt);
}else if(a[a[i].lt].p){
pk(i,a[i].lt);
die(i,a[i].lt);
}
}
if(a[0].b<1||fd>fb){//结束。
ed();
return;
}
}
}return;
}
int main(){//开始。
cin>>n>>m;hp=n;
for(int i=0;i<n;i++){
cin>>a[i].name,a[i].p=(!i?1:-1),a[i].mp=(!i);
getline(cin,a[i].s);
a[i].s+=' ',a[i].b=4,fb+=(a[i].name=="FP"),a[i].lt=(i+n-1)%n,a[i].nt=(i+1)%n;
}getline(cin,__),__+=' ';
game();
return 0;
}