灵异事件
查看原帖
灵异事件
767660
zhaohanwen楼主2023/7/5 14:29
#include<bits/stdc++.h>
using namespace std;
int m,n,p,ans=-1,crim,date;
int op[30],is[30],nw[30];
string str[30];
vector<int> o[30],wrd[30],pdd[30];
map<string,int> name;
bool cmp(string a,string b) {
	int rro=min(a.size(),b.size());
	for(int i=0; i<rro; i++)
		if(a[i]!=b[i])
			return false;
	return true;
}
void tak(string s) {
	string a,b,c;
	int who;
	int jl=s.length();
	for(int i=0; i<jl; i++) {
		if(s[i]==':') {
			a=s.substr(0,i);
			b=s.substr(i+2,s.size()-i-1);
			break;
		}
	}
	who=name[a];
	if(cmp(b,"I am guilty.")) {
		if(is[who]==-1) {
			cout<<"Impossible";
			exit(0);
		}
		is[who]=1;
		return;
	}
	if(cmp(b,"I am not guilty.")) {
		if(is[who]==1) {
			cout<<"Impossible";
			exit(0);
		}
		is[who]=-1;
		return;
	}
	for(int i=0; i<b.size(); i++) {
		if(b[i]==' ') {
			a=b.substr(0,i);
			b=b.substr(i+1,s.size()-i);
			break;
		}
	}
	if(name[a] && cmp(b,"is guilty.")) {
		o[who].push_back(name[a]);
		return;
	}
	if(name[a] && cmp(b,"is not guilty.")) {
		wrd[who].push_back(name[a]);
		return;
	}
	for(int i=0; i<b.size(); i++) {
		if(b[i]==' ') {
			c=b.substr(0,i);
			b=b.substr(i+1,s.size()-i);
			break;
		}
	}
	if(cmp(a,"Today") && cmp(c,"is")) {
		if(cmp(b,"Monday.")) {
			pdd[who].push_back(1);
			return;
		}
		if(cmp(b,"Tuesday.")) {
			pdd[who].push_back(2);
			return;
		}
		if(cmp(b,"Wednesday.")) {
			pdd[who].push_back(3);
			return;
		}
		if(cmp(b,"Thursday.")) {
			pdd[who].push_back(4);
			return;
		}
		if(cmp(b,"Friday.")) {
			pdd[who].push_back(5);
			return;
		}
		if(cmp(b,"Saturday.")) {
			pdd[who].push_back(6);
			return;
		}
		if(cmp(b,"Sunday.")) {
			pdd[who].push_back(7);
			return;
		}
	}
	return;
}
bool check() {
	memset(nw,0,sizeof nw);
	for(int i=1; i<=m; i++) {
		if(is[i]!=0) {
			if(i==crim) {
				if(is[i]==1)
					nw[i]=1;
				else if(is[i]==-1)nw[i]=-1;
			} else {
				if(is[i]==1)
					nw[i]=-1;
				else if(is[i]==-1)nw[i]=1;
			}
		}
	}
	for(int i=1; i<=m; i++) {
		for(int j=0; j<pdd[i].size(); j++) {
			if(pdd[i][j]==date) {
				if(nw[i]==-1)
					return 0;
				else nw[i]=1;
			} else {
				if(nw[i]==1)
					return 0;
				else nw[i]=-1;
			}
		}
	}
	for(int i=1; i<=m; i++) {
		for(int j=0; j<o[i].size(); j++) {
			if(o[i][j]==crim) {
				if(nw[i]==-1)
					return 0;
				else nw[i]=1;
			} else {
				if(nw[i]==1)
					return 0;
				else nw[i]=-1;
			}
		}
	}
	for(int i=1; i<=m; i++) {
		int ppx=wrd[i].size();
		for(int j=0; j<ppx; j++) {
			if(wrd[i][j]==crim) {
				if(nw[i]==1)
					return 0;
				else nw[i]=-1;
			} else {
				if(nw[i]==-1)
					return 0;
				else nw[i]=1;
			}
		}
	}
	int cnt1=0,cnt2=0;
	for(int i=1; i<=m; i++) {
		if(nw[i]==-1)
			cnt1++;
		else if(nw[i]==0)
			cnt2++;
	}
	if(cnt1<=n&&cnt1+cnt2>=n)
		return true;
	return false;
}
int main() {
	cin>>m>>n>>p;
	for(int i=1; i<=m; i++) {
		cin>>str[i];
		name[str[i]]=i;
	}
	for(int i=1; i<=p; i++) {
		char c;
		string s="";
		while((c=getchar())!=-1) {
			if(c!='\n')
				s+=c;
			if(c=='\n'&&s.size()>=3)
				break;
		}
		if(s.size()>=10)
			tak(s);
	}
	for(int i=1; i<=m; i++) {
		crim=i;
		for(int j=1; j<=7; j++) {
			date=j;
			if(check() && (ans==-1 || ans==crim))
				ans=crim;
			else if(check() && ans!=-1 && ans!=crim) {
				cout<<"Cannot Determine";
				return 0;
			}
		}
	}
	if(ans==-1)
		cout<<"Impossible";
	else
		cout<<str[ans];
	return 0;
}

#3 #4 WA

#3 数据下载下来本地能过,OJ不能

testcase #3

in

5 1 5
A
B
C
D
E
A: Today is Monday.
B: Today is Thursday.
C: Today is Monday.
B: D is not guilty.
E: I am not guilty.


out(OJ)

Cannot Determine

out(local)

D
2023/7/5 14:29
加载中...