#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
inline ll read(){
ll f=1,sum=0;char c=getchar();
while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}
while(isdigit(c)) {sum=sum*10+c-'0';c=getchar();}
return sum*f;
}
inline void print(ll x){
if(x<0){putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
struct node{
int cs,hp,nxt,lst;
char id,card[2005];
bool zgln;
}a[25];
char kn[15],kpd[2005],c[15];
int n,m,fz;
bool ed;
void mp(int x){
if(!m) m++;
a[x].card[++a[x].cs]=kpd[m];
m--;
}
void js(int x1,int x2){
for(int i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='P'){
a[x2].card[i]='U';
a[x2].hp++;
return ;
}
}
a[a[x2].nxt].lst=a[x2].lst;
a[a[x2].lst].nxt=a[x2].nxt;
if(x2==1){
ed=1;
return ;
}
if(a[x2].id=='F') fz--;
if(!fz){
ed=1;
return ;
}
if(a[x2].id=='F'){
mp(x1);
mp(x1);
mp(x1);
}
if(a[x2].id=='Z' && a[x1].id=='M'){
a[x1].cs=0;
a[x1].zgln=0;
}
}
void Kil(int x1,int x2){
for(int i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='D'){
a[x2].card[i]='U';
return ;
}
}
a[x2].hp--;
if(!a[x2].hp) js(x1,x2);
}
bool wxkj(int x1,int x2,int x3){
int i=x1,pd=x3?x2:x1;
while(1){
if(x3==1){
if(kn[x2]==a[i].id || (kn[x2]=='M' && a[i].id=='Z') || (kn[x2]=='Z' && a[i].id=='M')){
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]=='J'){
a[i].card[j]='U';
kn[i]=a[i].id;
return !wxkj(i,x1,0);
}
}
}
}
else{
if(((a[i].id=='M' || a[i].id=='Z') && kn[x1]=='F') || (a[i].id=='F' && (kn[x1]=='M' || kn[x1]=='Z'))){
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]=='J'){
a[i].card[j]='U';
kn[i]=a[i].id;
return !wxkj(i,x1,0);
}
}
}
}
i=a[i].nxt;
if(i==x1) break;
}
return false;
}
void jd(int x1,int x2){
int i,j,k;
if(wxkj(x1,x2,1)) return ;
if(x1==1 && a[x2].id=='Z'){
a[x2].hp--;
if(!a[x2].hp) js(x1,x2);
return ;
}
j=k=1;
while(1){
while(a[x2].card[j]!='K' && j<=a[x2].cs) j++;
if(j>a[x2].cs){
a[x2].hp--;
if(!a[x2].hp) js(x1,x2);
return ;
}
else a[x2].card[j]='U';
while(a[x1].card[k]!='K' && k<=a[x1].cs) k++;
if(k>a[x1].cs){
a[x1].hp++;
if(!a[x1].hp) js(x2,x1);
return ;
}
else a[x1].card[k]='U';
}
}
void nmrq(int x1){
for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
if(!wxkj(x1,x2,1)){
int i;
for(i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='K'){
a[x2].card[i]='U';
break;
}
}
if(i>a[x2].cs){
a[x2].hp--;
if(x2==1 && kn[x1]=='U') kn[x1]='L';
if(!a[x2].hp) js(x1,x2);
if(ed) return ;
}
}
}
}
void wjqf(int x1){
for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
if(!wxkj(x1,x2,1)){
int i;
for(i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='D'){
a[x2].card[i]='U';
break;
}
}
if(i>a[x2].cs){
a[x2].hp--;
if(x2==1 && kn[x1]=='U') kn[x1]='L';
if(!a[x2].hp) js(x1,x2);
if(ed) return ;
}
}
}
}
void hh(){
char nc;
ed=1;
if(fz) ed=0;
if(ed) return ;
for(int i=1;i;i=a[i].nxt){
mp(i);
mp(i);
bool kill=1;
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]!='U'){
if(!a[i].hp) break;
nc=a[i].card[j];
if(nc=='P'){
if(a[i].hp!=4){
a[i].hp++;
a[i].card[j]='U';
}
continue;
}
if(nc=='K'){
if(!kill && !a[i].zgln) continue;
if(a[i].id=='M' && kn[a[i].nxt]!='L' && kn[a[i].nxt]!='F') continue;
if(a[i].id=='Z' && kn[a[i].nxt]!='F') continue;
if(a[i].id=='F' && kn[a[i].nxt]!='Z' && kn[a[i].nxt]!='M') continue;
a[i].card[j]='U';
Kil(i,a[i].nxt);
kn[i]=a[i].id;
kill=0;
if(ed) return ;
continue;
}
if(nc=='F'){
if(a[i].id=='F'){
a[i].card[j]='U';
kn[i]=a[i].id;
if(ed) return ;
j=0;
continue;
}
for(int k=a[i].nxt;k!=i;k=a[k].nxt){
if((a[i].id=='M' && (kn[k]=='L' || kn[k]=='F')) || (a[i].id=='Z' && kn[k]=='F')){
a[i].card[j]='U';
jd(i,k);
kn[i]=a[i].id;
if(ed) return ;
j=0;
break;
}
}
continue;
}
if(nc=='N'){
a[i].card[j]='U';
nmrq(i);
if(ed) return ;
j=0;
continue;
}
if(nc=='W'){
a[i].card[j]='U';
wjqf(i);
if(ed) return ;
j=0;
continue;
}
if(nc=='Z'){
a[i].zgln=1;
a[i].card[j]='U';
j=0;
continue;
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].nxt=i+1;
a[i].lst=i-1;
}
a[n].nxt=1;
a[1].lst=n;
for(int i=1;i<=n;i++){
for(int j=1;j<=2000;j++) a[i].card[j]='U';
cin>>c;
a[i].id=c[0];
for(int j=1;j<=4;j++){
cin>>c;
a[i].card[j]=c[0];
}
a[i].cs=4;
a[i].hp=4;
if(a[i].id=='F') fz++;
a[i].zgln=0;
}
for(int i=2;i<=n;i++) kn[i]='U';
kn[1]='M';
for(int i=1;i<=m;i++){
cin>>c;
kpd[m-i+1]=c[0];
}
hh();
if(a[1].hp<=0) cout<<"FP\n";
else cout<<"MP\n";
for(int i=1;i<=n;i++){
if(a[i].hp<=0) cout<<"DEAD\n";
else{
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]!='U') cout<<a[i].card[j]<<" ";
}
cout<<"\n";
}
}
return 0;
}
提交记录:https://www.luogu.com.cn/record/233756781