大模拟求 Hack
查看原帖
大模拟求 Hack
556362
Unnamed114514楼主2022/10/28 00:28
#include<bits/stdc++.h>
using namespace std;
int n,m,tot,f[15],pre[15],nxt[15],cnt[15];
bool flg[15],flg1[15],flg2[15],flg3[15],flg4[15];
char c[2005];
deque<char> q[15];
inline void print(){
	bool p=1;
	for(int i=1;i<=n;++i)
		if(f[i]==1&&flg[i]){
			puts("FP");
			p=0;
			break;
		}
	if(p)
		puts("MP");
	for(int i=1;i<=n;++i)
		if(flg[i])
			puts("DEAD");
		else{
			for(int j=0,len=q[i].size();j<len;++j)
				putchar(q[i][j]),putchar(' ');
			puts("");
		}
}
inline bool check(){
	for(int i=1;i<=n;++i)
		if(f[i]==1&&flg[i]){
			print();
			return 1;
		}
	for(int i=1;i<=n;++i)
		if(f[i]==3&&!flg[i])
			return 0;
	print();
	return 1;
}
inline void get(int x){
	q[x].push_back(c[tot]);
	if(tot!=m)
		++tot;
}
inline bool find(int x,char c){
	for(int i=0,len=q[x].size();i<len;++i)
		if(q[x][i]==c){
			q[x].erase(q[x].begin()+i);
			return 1;
		}
	return 0;
}
inline void del(int x){
	nxt[pre[x]]=nxt[x];
	pre[nxt[x]]=pre[x];
}
void work(int x){
	if(check())
		return;
	get(x),get(x);
	bool chk=0,u=1;
	while(u){
		u=0;
		for(int i=0;i<q[x].size();++i)
			if(q[x][i]=='P'){
				if(cnt[x]!=4)
					++cnt[x];
				q[x].erase(q[x].begin()+i);
				--i;
			} else if(q[x][i]=='K'){
				if(!flg4[x]&&chk)
					continue;
				if(f[x]==1){
					if(flg1[nxt[x]]||flg3[nxt[x]]){
						q[x].erase(q[x].begin()+i);
						--i;
						chk=1;
						if(!find(nxt[x],'D'))
							--cnt[nxt[x]];
						if(!cnt[nxt[x]]){
							if(find(nxt[x],'P'))
								++cnt[nxt[x]];
							else{
								flg[nxt[x]]=1;
								if(check())
									return;
								if(f[nxt[x]]==2)
									q[x].clear();
								else
									get(x),get(x),get(x),u=1;
								del(nxt[x]);
							}
						}
					}
				} else if(f[x]==2){
					if(flg3[nxt[x]]){
						q[x].erase(q[x].begin()+i);
						--i;
						chk=1;
						flg2[x]=1,flg1[x]=0;
						if(!find(nxt[x],'D'))
							--cnt[nxt[x]];
						if(!cnt[nxt[x]]){
							if(find(nxt[x],'P'))
								++cnt[nxt[x]];
							else{
								flg[nxt[x]]=1;
								if(check())
									return;
								get(x),get(x),get(x),u=1;
								del(nxt[x]);
							}
						}
					}
				} else{
					if(flg2[nxt[x]]){
						q[x].erase(q[x].begin()+i);
						--i;
						chk=1;
						flg3[x]=1,flg1[x]=0;
						if(!find(nxt[x],'D'))
							--cnt[nxt[x]];
						if(!cnt[nxt[x]]){
							if(find(nxt[x],'P'))
								++cnt[nxt[x]];
							else{
								flg[nxt[x]]=1;
								if(check())
									return;
								del(nxt[x]);
							}
						}
					}
				}
			} else if(q[x][i]=='Z'){
				q[x].erase(q[x].begin()+i);
				--i;
				flg4[x]=1;
			} else if(q[x][i]=='F'){
				int t=nxt[x];
				while(t!=x){
					if(f[x]==1){
						if(flg1[t]||flg3[t]){
							q[x].erase(q[x].begin()+i);
							--i;
							if(f[t]==2){
								--cnt[t];
								if(!cnt[t]){
									if(find(t,'P'))
										++cnt[t];
									else{
										flg[t]=1;
										if(check())
											return;
										q[x].clear();
										del(t);
									}
								}
							} else{
								bool p=1;
								int T=nxt[t];
								if((flg2[t]||flg3[t])&&find(t,'J'))
									break;
								while(T!=t){
									if(f[T]==3&&find(T,'J')){
										p=0;
										flg3[T]=1,flg1[T]=0;
										break;
									}
									T=nxt[T];
	   							}
								if(!p)
									break;
								while(find(t,'K')){
									if(!find(x,'K')){
										p=0;
										break;
									}
								}
								if(p){
									--cnt[t];
									if(!cnt[t]){
										if(find(t,'P'))
											++cnt[t];
										else{
											flg[t]=1;
											if(check())
												return;
											get(x),get(x),get(x),u=1;
											del(t);
										}
									}
								} else{
									--cnt[x];
									if(!cnt[x]){
										if(find(x,'P'))
											++cnt[x];
										else{
											flg[x]=1;
											if(check())
												return;
											del(x);
										}
									}
								}
							}
							break;
						}
					} else if(f[x]==2){
						if(flg3[t]){
							q[x].erase(q[x].begin()+i);
							--i;
							flg2[x]=1,flg1[x]=0;
							if(find(t,'J'))
								break;
							bool p=1;
							int T=nxt[t];
							while(T!=t){
								if(f[T]==3&&find(T,'J')){
									p=0;
									flg3[T]=1,flg1[T]=0;
									break;
								}
								T=nxt[T];
		   					}
							if(!p)
								break;
							while(find(t,'K')){
								if(!find(x,'K')){
									p=0;
									break;
								}
							}
							if(p){
								--cnt[t];
								if(!cnt[t]){
									if(find(t,'P'))
										++cnt[t];
									else{
										flg[t]=1;
										if(check())
											return;
										get(x),get(x),get(x),u=1;
										del(t);
									}
								}
							} else{
								--cnt[x];
								if(!cnt[x]){
									if(find(x,'P'))
										++cnt[x];
									else{
										flg[x]=0;
										if(check())
											return;
										del(x);
									}
								}
							}
							break;
						}
					} else{
						if(flg2[t]){
							q[x].erase(q[x].begin()+i);
							--i;
							flg3[x]=1,flg1[x]=0;
							bool p=1;
							int T=nxt[t];
							if(find(t,'J'))
								break;
							while(T!=t){
								if((f[T]==2||f[T]==1)&&find(T,'J')){
									p=0;
									flg2[T]=1,flg1[T]=0;
									break;
								}
								T=nxt[T];
	   						}
							if(!p)
								break;
							while(find(t,'K')){
								if(!find(x,'K')){
									p=0;
									break;
								}
							}
							if(p){
								--cnt[t];
								if(!cnt[t]){
									if(find(t,'P'))
										++cnt[t];
									else{
										flg[t]=1;
										if(check())
											return;
										del(t);
									}
								}
							} else{
								--cnt[x];
								if(!cnt[x]){
									if(find(x,'P'))
										++cnt[x];
									else{
										flg[x]=1;
										if(check())
											return;
										get(t),get(t),get(t),u=1;
										del(x);
									}
								}
							}
							break;
						}
					}
					t=nxt[t];
				}
			} else if(q[x][i]=='N'){
				q[x].erase(q[x].begin()+i);
				--i;
				int t=nxt[x];
				while(t!=x){
					if(!find(t,'K')){
						if((flg2[t]||flg3[t])&&find(t,'J'))
							continue;
						int T=nxt[t];
						bool p=0;
						while(T!=t){
							if(f[T]==3&&flg3[t]&&find(T,'J')){
								flg3[T]=1,flg1[T]=0;
								p=1;
								break;
							}
							if((f[T]==1||f[T]==2)&&flg2[t]&&find(T,'J')){
								flg2[T]=1,flg1[T]=0;
								p=1;
								break;
							}
							T=nxt[T];
						}
						if(p)
							continue;
						--cnt[t];
						if(f[t]==1&&!flg2[x]&&!flg3[x])
							flg1[x]=1;
						if(!cnt[t]){
							if(find(t,'P'))
								++cnt[t];
							else{
								flg[t]=1;
								if(check())
									return;
								del(t);
								if(f[t]==3)
									get(x),get(x),get(x),u=1;
								else if(f[t]==2&&f[x]==1)
									q[x].clear();
							}
						}
					}
					t=nxt[t];
				}
			} else if(q[x][i]=='W'){
				q[x].erase(q[x].begin()+i);
				--i;
				u=1;
				int t=nxt[x];
				while(t!=x){
					if(!find(t,'D')){
						if((flg2[t]||flg3[t])&&find(t,'J'))
							continue;
						int T=nxt[t];
						bool p=0;
						while(T!=t){
							if(f[T]==3&&flg3[t]&&find(T,'J')){
								flg3[T]=1,flg1[T]=0;
								p=1;
								break;
							}
							if((f[T]==1||f[T]==2)&&flg2[t]&&find(T,'J')){
								flg2[T]=1,flg1[T]=0;
								p=1;
								break;
							}
							T=nxt[T];
						}
						if(p)
							continue;
						--cnt[t];
						if(f[t]==1&&!flg2[x]&&!flg3[x])
							flg1[x]=1;
						if(!cnt[t]){
							if(find(t,'P'))
								++cnt[t];
							else{
								flg[t]=1;
								if(check())
									return;
								del(t);
								if(f[t]==3)
									get(x),get(x),get(x),u=1;
								else if(f[t]==2&&f[x]==1)
									q[x].clear();
							}
						}
					}
					t=nxt[t];
				}
			}
	}
	work(nxt[x]);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		nxt[i]=i+1,pre[i]=i-1;
		string s;
		cin>>s;
		if(s=="MP")
			f[i]=1,flg2[i]=1;
		else if(s=="ZP")
			f[i]=2;
		else if(s=="FP")
			f[i]=3;
		for(int j=1;j<=4;++j){
			cin>>c[0];
			q[i].push_back(c[0]);
		}
		cnt[i]=4;
	}
	for(int i=1;i<=m;++i)
		cin>>c[i];
	nxt[n]=tot=1,pre[1]=n;
	work(1);
	return 0;
}
2022/10/28 00:28
加载中...