code(WA on #17 & #21):
#include<iostream>
#include<algorithm>
using namespace std;
struct player {
bool eq;//equipped
int hp,size,next,last,id,behave;
char hand[2010];
}players[11];
int n,m,cnt,top;
char cards[2010];
bool is_end;
void draw(int p,int num) {
while(num--) {
players[p].hand[++players[p].size]=cards[top];
if(top>1)top--;
}
}
void dying(int pre,int nxt) {
for(int i=1;i<=players[nxt].size;i++) {
if(players[nxt].hand[i]=='P') {
players[nxt].hand[i]='0';
players[nxt].hp++;
return;
}
}
players[players[nxt].next].last=players[nxt].last;
players[players[nxt].last].next=players[nxt].next;
if(players[nxt].id==3)cnt--;
if(!cnt||players[nxt].id==1) {
is_end=true;
return;
}
if(players[nxt].id==3)draw(pre,3);
if(players[nxt].id==2&&players[pre].id==1) {
players[pre].size=0;
players[pre].eq=false;
}
}
void atk(int pre,int nxt) {
for(int i=1;i<=players[nxt].size;i++) {
if(players[nxt].hand[i]=='D') {
players[nxt].hand[i]='0';
return;
}
}
players[nxt].hp--;
if(!players[nxt].hp)dying(pre,nxt);
}
bool parry(int pre,int nxt,int flag) {
int i=pre;
do {
if(flag) {
if(players[nxt].behave==players[i].id||(players[nxt].behave==1&&players[i].id==2)||(players[nxt].behave==2&&players[i].id==1)) {
for(int j=1;j<=players[i].size;j++) {
if(players[i].hand[j]=='J') {
players[i].hand[j]='0';
players[i].behave=players[i].id;
return !parry(i,pre,0);
}
}
}
}else {
if(((players[i].id==1||players[i].id==2)&&players[pre].behave==3)||(players[i].id==3&&(players[pre].behave==1||players[pre].behave==2))) {
for(int j=1;j<=players[i].size;j++) {
if(players[i].hand[j]=='J') {
players[i].hand[j]='0';
players[i].behave=players[i].id;
return !parry(i,pre,0);
}
}
}
}
i=players[i].next;
}while(i!=pre);
return false;
}
void duel(int pre,int nxt) {
if(parry(pre,nxt,1))return;
if(players[pre].id==1&&players[nxt].id==2) {
players[nxt].hp--;
if(players[nxt].hp<=0)dying(pre,nxt);
return;
}
int l=1,r=1;
while(true) {
while(r<=players[nxt].size&&players[nxt].hand[r]!='K')r++;
if(r>players[nxt].size) {
players[nxt].hp--;
if(players[nxt].hp<=0)dying(pre,nxt);
return;
}else players[nxt].hand[r]='0';
while(l<=players[pre].size&&players[pre].hand[l]!='K')l++;
if(l>players[pre].size) {
players[pre].hp--;
if(players[pre].hp<=0)dying(nxt,pre);
return;
} else players[pre].hand[l]='0';
}
}
void south_invade(int pre) {
int j;
for(int i=players[pre].next;i!=pre;i=players[i].next) {
if(parry(pre,i,1))continue;
for(j=1;j<=players[i].size;j++) {
if(players[i].hand[j]=='K') {
players[i].hand[j]='0';
break;
}
}
if(j>players[i].size) {
players[i].hp--;
if(players[i].id==1&&!players[pre].behave)players[pre].behave=4;
if(players[i].hp<=0)dying(pre,i);
if(is_end)return;
}
}
}
void shoot_at_once(int pre) {
int j;
for(int i=players[pre].next;i!=pre;i=players[i].next) {
if(parry(pre,i,1))continue;
for(j=1;j<=players[i].size;j++) {
if(players[i].hand[j]=='D') {
players[i].hand[j]='0';
break;
}
}
if(j>players[i].size) {
players[i].hp--;
if(players[i].id==1&&!players[pre].behave)players[pre].behave=4;
if(players[i].hp<=0)dying(pre,i);
if(is_end)return;
}
}
}
void mainloop() {
if(!cnt)return;
int i=0;
bool used=false;
while(!is_end) {
draw(i,2);
for(int j=1;j<=players[i].size;j++) {
if(players[i].hand[j]=='0'||players[i].hand[j]=='D')continue;
if(!players[i].hp)break;
if(players[i].hand[j]=='P') {
if(players[i].hp<4) {
players[i].hp++;
players[i].hand[j]='0';
}
continue;
}
if(players[i].hand[j]=='K') {
if(used&&!players[i].eq)continue;
if((players[i].id==1&&players[players[i].next].behave!=3&&players[players[i].next].behave!=4)||(players[i].id==2&&players[players[i].next].behave!=3)||(players[i].id==3&&players[players[i].next].behave!=1&&players[players[i].next].behave!=2))continue;
players[i].hand[j]='0';
atk(i,players[i].next);
players[i].behave=players[i].id;
used=true;
if(is_end)return;
continue;
}
if(players[i].hand[j]=='F') {
if(players[i].id==3) {
players[i].hand[j]='0';
duel(i,0);
players[i].behave=players[i].id;
if(is_end)return;
j=0;
}else {
int k=players[i].next;
while(k!=i) {
if((players[i].id==1&&players[k].behave>=3)||(players[i].id==2&&players[k].behave==3)) {
players[i].hand[j]='0';
duel(i,k);
players[i].behave=players[i].id;
if(is_end)return;
j=0;
break;
}
k=players[k].next;
}
}
continue;
}
if(players[i].hand[j]=='N') {
players[i].hand[j]='0';
south_invade(i);
if(is_end)return;
j=0;
continue;
}
if(players[i].hand[j]=='W') {
players[i].hand[j]='0';
shoot_at_once(i);
if(is_end)return;
j=0;
continue;
}
if(players[i].hand[j]=='Z') {
players[i].hand[j]='0';
players[i].eq=true;
j=0;
}
}
i=players[i].next;
}
}
int main() {
cin>>n>>m;
for(int i=0;i<n;i++) {
players[i].size=players[i].hp=4;
players[i].behave=0;
string s;
cin>>s;
if (s[0]=='M')players[i].id=players[i].behave=1;
if (s[0]=='Z')players[i].id=2;
if (s[0]=='F'){
players[i].id=3;
cnt++;
}
players[i].eq=false;
players[i].last=(i-1+n)%n;
players[i].next=(i+1)%n;
for(int j=1;j<=4;j++) {
cin>>s;
players[i].hand[j]=s[0];
}
}
for(int i=1;i<=m;i++) {
string s;
cin>>s;
cards[i]=s[0];
}
reverse(cards+1,cards+m+1);
top=m;
mainloop();
if(players[0].hp<=0)cout<<"FP"<<endl;
else cout<<"MP"<<endl;
for(int i=0;i<n;i++) {
if(players[i].hp<=0)cout<<"DEAD"<<endl;
else {
for(int j=1;j<=players[i].size;j++)
if(players[i].hand[j]!='0')
cout<<players[i].hand[j]<<' ';
cout<<endl;
}
}
return 0;
}