0pts,只过了样例,蒟蒻实在是改不动力
#include<bits/stdc++.h>
#define rep(i,n,m) for(int i(n);i<=m;++i)
#define Rep(i,n,m) for(int i(n+1);i!=n;i=(i)%(m)+1)
using namespace std;
int id_sum[3],n,m,top;
char Card[2005];
set<int> leifan;
struct Pig{
int id;//0:Master Pig;1:Zhong Pig;2:Fan Pig
int hp=4,tot=4,num,alive=1,wuqi=0,have_used_sha;
int card[11],flag=0;
multiset<pair<char,int>> order;
};
Pig pig[11];
int CTOI(char ch){
switch(ch){
case 'P': return 0;
case 'K': return 1;
case 'D': return 2;
case 'F': return 3;
case 'N': return 4;
case 'W': return 5;
case 'J': return 6;
case 'Z': return 7;
default: return -1;
}
}
char ITOC(int x){
switch(x){
case 0: return 'P';
case 1: return 'K';
case 2: return 'D';
case 3: return 'F';
case 4: return 'N';
case 5: return 'W';
case 6: return 'J';
case 7: return 'Z';
}
return '\0';
}
void print(){
rep(i,1,n){
if(!pig[i].alive) cout<<"DEAD\n";
else{
set<pair<int,char>> tmp;
for(auto it:pig[i].order) tmp.insert({it.second,it.first});
bool first=1;
for(auto it:tmp){
if(!first) cout<<" ";
cout<<it.second;
first=0;
}
cout<<"\n";
}
}
exit(0);
}
bool check_same(int p1,int p2){
return (pig[p1].id==pig[p2].id&&pig[p1].flag!=0&&pig[p2].flag!=0);
}
void pumping(int pos,int num){
while(num--){
if(top!=m) ++top;
++pig[pos].card[CTOI(Card[top])];
pig[pos].order.insert({Card[top],++pig[pos].tot});
}
}
bool use_tao(int pos){
if(pig[pos].card[0]<=0) return 0;
--pig[pos].card[0],++pig[pos].hp;
auto it=pig[pos].order.lower_bound({'P',0});
pig[pos].order.erase(it);
return 1;
}
bool use_shan(int pos){
if(pig[pos].card[CTOI('D')]<=0) return 0;
--pig[pos].card[CTOI('D')];
auto it=pig[pos].order.lower_bound({'D',0});
pig[pos].order.erase(it);
return 1;
}
void dying(int pos,int from){
while(use_tao(pos));
if(pig[pos].hp<1){
pig[pos].alive=0;
--id_sum[pig[pos].id];
if(id_sum[pig[pos].id]==0){
if(pig[pos].id==2){
cout<<"MP\n";
print();
}
}
if(pig[pos].id==0&&pig[pos].hp<=0){
cout<<"FP\n";
print();
}
if(pig[from].id==0&&pig[pos].id==1){
rep(i,0,7) pig[from].card[i]=0;
pig[from].order.clear();
pig[from].wuqi=0;
}
if(pig[pos].id==2) pumping(from,3);
}
}
void been_kill(int pos,int from){
if(use_shan(pos));
else{
--pig[pos].hp;
if(pig[pos].hp<1) dying(pos,from);
}
}
void use_wuqi(int pos){
if(!pig[pos].card[CTOI('Z')]) return;
auto it=pig[pos].order.lower_bound({CTOI('Z'),0});
--pig[pos].card[CTOI('Z')];
pig[pos].order.erase(it);
pig[pos].wuqi=1;
}
void fight(int from,int pos){
pig[from].flag=1;
while(pig[from].card[CTOI('K')]>=1&&pig[pos].card[CTOI('K')]>=1){
auto it=pig[pos].order.lower_bound({CTOI('K'),0});
--pig[pos].card[CTOI('K')];
pig[pos].order.erase(it);
swap(from,pos);
}
if(!pig[from].card[CTOI('K')]&&pig[pos].card[CTOI('K')]>0) swap(from,pos);
--pig[pos].hp;
// cout<<from<<" "<<pos<<" "<<pig[pos].hp<<"\n";
if(pig[pos].hp<1) dying(pos,from);
}
void use_wuxie(int from,int pos,int need){
if(need!=CTOI('F')&&pig[pos].card[need]>0&&pig[pos].flag!=0){
--pig[pos].card[need];
pig[pos].order.erase(pig[pos].order.lower_bound({ITOC(need),0}));
return ;
}
int f=1;
while(pig[pos].flag!=0){
bool flag=0;
if(f&&pig[pos].card[CTOI('J')]){
--pig[pos].card[CTOI('J')];
auto it=pig[pos].order.lower_bound({'J',0});
pig[pos].order.erase(it);
f=0;
flag=1;
pos=from;
}
if(!flag){
rep(i,1,n){
if(pig[i].alive && (check_same(i,pos)^!f) && pig[i].card[CTOI('J')]){
--pig[i].card[CTOI('J')];
auto it=pig[i].order.lower_bound({'J',0});
pig[i].order.erase(it);
f^=1;
flag=1;
pos=i;
break;
}
}
}
if(!flag) break;
}
// cout<<from<<" "<<pos<<" "<<need<<"\n";
if(f){
if(need==0) fight(from,pos);
else if(need==CTOI('K')||need==CTOI('D')){
--pig[pos].hp;
if(pig[pos].hp<1) dying(pos,from);
}
}
}
bool use_sha(int pos){
if((pig[pos].have_used_sha&&!pig[pos].wuqi)||!pig[pos].card[CTOI('K')]) return 0;
int next=(pos==n)?1:pos+1;
while(!pig[next].alive)next=(pos==n)?1:pos+1;
auto it=leifan.lower_bound(next);
if(pig[next].alive&&(!check_same(pos,next)||it!=leifan.end()&&(*it)==next)&&(pig[next].flag||pig[next].id==0)){
pig[pos].have_used_sha=1;
pig[pos].flag=1;
--pig[pos].card[CTOI('K')];
auto it=pig[pos].order.lower_bound({'K',0});
pig[pos].order.erase(it);
if(!use_shan(next)) been_kill(next,pos);
return 1;
}
return 0;
}
void action(int pos){
pig[pos].have_used_sha=0;
pumping(pos,2);
if(pig[pos].hp<4) while(use_tao(pos));
if(!pig[pos].wuqi&&pig[pos].card[CTOI('Z')]) use_wuqi(pos);
// rep(i,1,n){
// cout<<i<<" "<<pig[i].alive<<" "<<pig[i].flag<<" "<<pig[i].id<<" "<<pig[i].wuqi<<" "<<pig[i].hp<<"\n";
// rep(j,0,7) cout<<pig[i].card[j]<<" ";
// cout<<"\n";
// }
rep(j,3,5){
while(pig[pos].card[j]>0){
bool used=0;
Rep(i,pos,n){
auto it=leifan.lower_bound(i);
// cout<<pos<<" "<<i<<" "<<pig[i].alive<<" "<<check_same(pos,i)<<"\n";
if(pig[i].alive&&(j!=3||!check_same(i,pos)&&pig[pos].flag&&pig[i].flag||it!=leifan.end()&&*it==i&&pos==1)){
if(i==1) leifan.insert(pos);
int need=0;
if(j==4) need=CTOI('K');
if(j==5) need=CTOI('D');
use_wuxie(pos,i,need);
used=1;
if(j==3) break;
}
}
if(!used) break;
--pig[pos].card[j];
auto it=pig[pos].order.lower_bound({ITOC(j),0});
// cout<<(it==pig[pos].order.begin())<<" "<<(it==pig[pos].order.begin())<<"\n";
if((it==pig[pos].order.begin())&&(it==pig[pos].order.begin())){
pig[pos].order.clear();
continue;
}
pig[pos].order.erase(it);
}
}
while(use_sha(pos));
}
signed main(){
// Rep(i,2,3) cout<<i<<"\n";
pig[1].flag=1;
cin>>n>>m;
rep(i,1,n){
string s; char t;
cin>>s;
if(s=="MP") pig[i].id=0;
else if(s=="ZP") pig[i].id=1;
else pig[i].id=2;
rep(j,1,4){
cin>>t;
++pig[i].card[CTOI(t)];
pig[i].order.insert({t,j});
}
}
rep(i,1,m) cin>>Card[i];
pig[1].flag=1;
rep(i,1,n) id_sum[pig[i].id]++;
while(1){
rep(i,1,n){
if(pig[i].alive){
action(i);
if(!id_sum[0]){ cout<<"FP\n"; print(); }
if(!id_sum[2]){ cout<<"MP\n"; print(); }
}
// cout<<"\n";
}
// cout<<"\n\n";
}
}