求调 P1039!悬赏 ¥2!
  • 板块灌水区
  • 楼主MWL_wma
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/1/21 22:09
  • 上次更新2024/1/22 10:31:49
查看原帖
求调 P1039!悬赏 ¥2!
1023017
MWL_wma楼主2024/1/21 22:09

蒟蒻的第一道蓝题!祭了

#include<bits/stdc++.h>
using namespace std;
string js[7]={"","I am guilty","I am not guilty","is guilty","is not guilty","Today is"};
string days[9]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"},name[22];
string s[102];
int n,top=1,di,m,q,sz;
int r[22][22],xq[22][9];
int hh[22],zh[22],ans;
bool dz;
bool zc(string s,string z){
	int l=s.length();
	for(int i=0;i<l;i++){
		if(s[i]==z[0]){
//			printf("%c %d\n",s[i],i);
			bool pd=1;
			int lz=z.length(); 
			++i;
			for(int j=1;j<lz;j++,i++){
				if(s[i]-z[j]){
					pd=0;
					break;
				}
			}
			if(pd){
				return 1;
			}
		}
	}
	return 0;
}
void sf(){
	int zf,td;
	for(int i=1;i<=n;i++){
		if(!hh[i]){
			zh[++di]=i;
		}
	}
	for(int i=1;i<=n;i++){
		bool pd=1;
		for(int j=1;j<=m;j++){
			if(i-hh[j]){
				pd=0;
				break;
			}
		}
		if(pd){
			for(int j=1;j<=n;j++){
				if(r[j][i]==1){
					if(!zf||zf==j){
						zf=j;
					}else{
						return ;
					}
					for(int l=1;l<=m;l++){
						if(r[hh[l]][j]==1){
							return ;
						}
					}
					for(int l=1;l<=di;l++){
						if(r[zh[i]][j]==-1){
							return ;
						}
					}
				}
				if(r[i][j]==-1){
					for(int k=1;k<=di;k++){
						if(r[zh[k]][i]==1){
							return ;
						}
					}
					for(int k=1;k<=m;k++){
						if(r[hh[k]][i]==-1){
							return ;
						}
					}
				}
			}
			for(int j=1;j<=7;j++){
				if(xq[j][i]==1){
					if(!td||td==j){
						td=j;
					}else{
						return ;
					}
					for(int l=1;l<=m;l++){
						if(xq[hh[l]][j]==1){
							return ;
						}
					}
					for(int l=1;l<=di;l++){
						if(xq[zh[i]][j]==-1){
							return ;
						}
					}
				}
				if(xq[i][j]==-1){
					for(int k=1;k<=di;k++){
						if(xq[zh[k]][i]==1){
							return ;
						}
					}
					for(int k=1;k<=m;k++){
						if(xq[zh[k]][i]==-1){
							return ;
						}
					}
				}
			}
		}else{
			for(int j=1;j<=n;j++){
				if(r[j][i]==-1){
					if(!zf||zf==j){
						zf=j;
					}else{
						return ;
					}
					for(int l=1;l<=di;l++){
						if(r[zh[l]][j]==-1){
							return ;
						}
					}
					for(int l=1;l<=di;l++){
						if(r[hh[i]][j]==1){
							return ;
						}
					}
				}
				if(r[i][j]==1){
					for(int k=1;k<=di;k++){
						if(r[zh[k]][i]==1){
							return ;
						}
					}
					for(int k=1;k<=m;k++){
						if(r[zh[k]][i]==-1){
							return ;
						}
					}
				}
			}
			for(int j=1;j<=7;j++){
				if(xq[j][i]==-1){
					if(!td||td==j){
						td=j;
					}else{
						return ;
					}
					for(int l=1;l<=m;l++){
						if(xq[zh[l]][j]==-1){
							return ;
						}
					}
					for(int l=1;l<=di;l++){
						if(xq[hh[i]][j]==1){
							return ;
						}
					}
				}
				if(xq[i][j]==1){
					for(int k=1;k<=di;k++){
						if(xq[zh[k]][i]==1){
							return ;
						}
					}
					for(int k=1;k<=m;k++){
						if(xq[zh[k]][i]==-1){
							return ;
						}
					}
				}
			}
		}
	}
	if(!ans||ans==zf){
		ans=zf;
	}else{
		dz=1;
	}
	for(int i=1;i<=m;i++){
		printf("%d ",hh[i]);
	}
	puts("");
	printf("%d %d\n",ans,dz);
	return ;
}
void mj(int z,int k){
	if(dz){
		return ;
	}
	if(!(k-m-1)){
		for(int i=1;i<=m;i++){
			printf("%d ",hh[i]);
		}
		puts("");
		sf();
	}
	for(int j=z+1;j<=n;j++){
		hh[k]=j;
		mj(j,k+1);
	}
}
int main(){
//	printf("%d\n",zc("10658758","658"));
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++){
		cin>>name[i];
	}
	for(int i=1;i<=q;i++){
		string yz;
		cin>>yz;
		for(int j=1;j<=n;j++){
			if(zc(yz,name[j])){
				sz=j;
				break;
			}
		}
		getline(cin,s[i]);
		if(!s[i].length()){
			q++;
			continue;
		}
		if(zc(s[i],js[1])){
			if(r[sz][sz]==-1){
				hh[top++]=sz;
			}
			r[sz][sz]=1;
//			printf("1:%d %d\n",sz,sz);
//			cout<<s[i]<<'\n';
		}else if(zc(s[i],js[2])){
			if(r[sz][sz]==1){
				hh[top++]=sz;
			}
			r[sz][sz]=-1;
//			printf("-1:%d %d\n",sz,sz);
//			cout<<s[i]<<'\n';
		}else if(zc(s[i],js[3])){
			for(int j=1;j<=n;j++){
				if(zc(s[i],name[j])&&j-sz){
					if(r[sz][j]==-1){
						hh[top++]=sz;
					}
					r[sz][j]=1;
//					printf("1:%d %d\n",j,sz);
					break;
				}
			}
//			cout<<s[i]<<'\n';
		}else if(zc(s[i],js[4])){
			for(int j=1;j<=n;j++){
				if(zc(s[i],name[j])&&j-sz){
					if(r[sz][j]==1){
						hh[top++]=sz;
					}
					r[sz][j]=-1;
//					printf("-1:%d %d\n",j,sz);
					break;
				}
			}
//			cout<<s[i]<<'\n';
		}else{
			for(int j=1;j<=7;j++){
				if(zc(s[i],days[j])){
					if(xq[sz][j]==-1){
						hh[top++]=sz;
					}
					xq[sz][j]=1;
//					printf("1:%d %d\n",j,sz);
				}
			}
//			cout<<s[i]<<'\n';
		}
	}
	for(int i=1;i<=n;i++){
		int ansz=0;
		for(int j=1;j<=n;j++){
			if(r[i][j]>0){
				++ansz;
			}
		}
		if(ansz>=2){
			hh[top++]=i;
		}else{
			ansz=0;
			for(int j=1;j<=7;j++){
				if(xq[i][j]>0){
					++ansz;
				}
			}
			if(ansz>=2){
				hh[top++]=i;
			}
		}
	}
	mj(0,top);
	if(dz){
		return !puts("Cannot Determine");
	}
	if(!ans){
		return !puts("Impossible");
	}
	cout<<name[ans];
	return 0;
}
/*
1 0 0
1 0 0
0 0 1

0 0 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
*/

记录

求调!钱周五给。

2024/1/21 22:09
加载中...