input
3 10
MP P F P F
FP F W D P
FP P Z P K
F K N N N N K W K F
ans
MP
K F
DEAD
DEAD
my output
MP
F F
DEAD
DEAD
mp code
#include<bits/stdc++.h>
#define For(i,j,k) for(auto i=j;i<=k;i++)
#define dFor(i,j,k) for(auto i=j;i>=k;i--)
#define MAXN 11
using namespace std;
int n,m,pig[MAXN];//1=主猪 2=忠猪 3=反猪
vector<char> pigcard[MAXN],card;
int sumcard[MAXN][256];
//P=桃 K=杀 D=闪 F=决斗 N=南猪入侵 W=万箭齐发 J=无懈可击 Z=猪哥连弩
int nxt[MAXN],prv[MAXN],blood[MAXN];
bool live[MAXN],zgln[MAXN];
int jump[MAXN];//跳忠=1 跳反=2
bool think[MAXN];//主猪认为是不是类反猪
int game=-1,sumfp=0;//反猪胜利=1 忠猪胜利=2
void print(){
cout<<"Blood:";
For(i,1,n) cout<<blood[i]<<' ';
cout<<endl;
cout<<"Jump:";
For(i,1,n) cout<<jump[i]<<' ';
cout<<endl;
cout<<"Think:";
For(i,1,n) cout<<think[i]<<' ';
cout<<endl;
cout<<"ZGLN:";
For(i,1,n) cout<<zgln[i]<<' ';
cout<<endl;
cout<<"SumFP:"<<sumfp<<endl;
cout<<"Game:"<<game<<endl;
For(i,1,n){
cout<<i<<':';
if(!live[i]) cout<<"DEAD"<<endl;
else{
for(char c:pigcard[i]) cout<<c<<' ';
cout<<endl;
}
}
cout<<"Card:";
for(char c:card) cout<<c<<' ';
cout<<endl;
}
bool biaodiyi(int x,int y,bool op){//x向y表敌意 op:是否能全场
if(pig[x]==1){
return jump[y]==2||think[y];
}else if(pig[x]==2){
if(jump[y]==2){
jump[x]=1;think[x]=0;
return 1;
}else return 0;
}else{
if((op==0&&jump[y]==1)||(op==1&&pig[y]==1)){
jump[x]=2;
return 1;
}else return 0;
}
}
void qipai(int x,char c){
cout<<x<<' '<<c<<endl;
sumcard[x][c]--;
for(auto it=pigcard[x].begin();it!=pigcard[x].end();it++){
if(*it==c){
pigcard[x].erase(it);
return ;
}
}
}
void mopai(int x,int sum){
cout<<x<<' '<<sum<<endl;
For(i,1,sum){
pigcard[x].push_back(card.front());
sumcard[x][card.front()]++;
if(card.size()>1){
card.erase(card.begin());
}
}
print();
}
void die(int killer,int x){
live[x]=0;
nxt[prv[x]]=nxt[x];
prv[nxt[x]]=prv[x];
if(pig[x]==1){
game=1;
return ;
}else if(pig[x]==2){
if(pig[killer]==1){
pigcard[killer].clear();
For(i,0,255) sumcard[killer][i]=0;
zgln[killer]=0;
}
}else{
sumfp--;
if(sumfp==0){
game=2;
return ;
}
mopai(killer,3);
}
}
void neardeath(int killer,int x){
if(sumcard[x]['P']>0){
blood[x]++;
qipai(x,'P');
}else{
die(killer,x);
}
}
void attack(int killer,int x){
cout<<killer<<" ATTECK "<<x<<endl;
blood[x]--;
if(pig[x]==1&&jump[killer]==0) think[killer]=1;
if(blood[x]==0){
neardeath(killer,x);
}
}
int Fpos(int x){
int y=nxt[x];
while(y!=x){
if(biaodiyi(x,y,1)){
return y;
}
y=nxt[y];
}
return -1;
}
void chupai(int x){
while(1){
if(game!=-1||!live[x]) return ;
bool flag=0,usedK=0;
for(char c:pigcard[x]){
if(c=='K'){
if((!usedK||zgln[x])&&biaodiyi(x,nxt[x],0)){
qipai(x,'K');
usedK=1;
if(sumcard[nxt[x]]['D']>0){
qipai(nxt[x],'D');
}else{
attack(x,nxt[x]);
if(game!=-1) return ;
}
flag=1;
break;
}
}else if(c=='P'){
if(blood[x]<4){
qipai(x,'P');
blood[x]++;
flag=1;
break;
}
}else if(c=='D'){
continue;
}else if(c=='F'){
int y=Fpos(x);
if(y==-1){
continue;
}
qipai(x,'F');
if(pig[x]==1&&pig[y]==2){
attack(x,y);
flag=1;
break;
}
int now=y,ano=x;
while(1){
if(sumcard[now]['K']>0){
qipai(now,'K');
}else{
attack(ano,now);
if(game!=-1) return ;
break;
}
swap(now,ano);
}
flag=1;
break;
}else if(c=='N'){
qipai(x,'N');
int y=nxt[x];
while(y!=x){
if(sumcard[y]['K']>0){
qipai(y,'K');
}else{
attack(x,y);
if(game!=-1) return ;
}
y=nxt[y];
}
flag=1;
break;
}else if(c=='W'){
qipai(x,'W');
int y=nxt[x];
while(y!=x){
if(sumcard[y]['D']>0){
qipai(y,'D');
}else{
attack(x,y);
if(game!=-1) return ;
}
y=nxt[y];
}
flag=1;
break;
}else if(c=='Z'){
qipai(x,'Z');
zgln[x]=1;
flag=1;
break;
}else if(c=='J'){
continue;
}
}
print();
if(!flag) break;
}
}
int main(){
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
For(i,1,n){
string op;
cin>>op;
if(op=="MP") pig[i]=1,jump[i]=1;
else if(op=="ZP") pig[i]=2;
else pig[i]=3,sumfp++;
For(j,1,4){
char c;
cin>>c;
pigcard[i].push_back(c);
sumcard[i][c]++;
}
nxt[i]=i%n+1;
prv[nxt[i]]=i;
live[i]=1;
blood[i]=4;
}
For(i,1,m){
char c;
cin>>c;
card.push_back(c);
}
int now=1;
while(game==-1){
if(live[now]){
mopai(now,2);
chupai(now);
}
now=nxt[now];
}
if(game==1){
cout<<"FP"<<endl;
}else{
cout<<"MP"<<endl;
}
For(i,1,n){
if(!live[i]) cout<<"DEAD"<<endl;
else{
if(!pigcard[i].empty()){
for(char ch:pigcard[i]){
cout<<ch<<' ';
}
}
cout<<endl;
}
}
return 0;
}