本地过样例,提交全RE,洛谷IDE测样例RE
查看原帖
本地过样例,提交全RE,洛谷IDE测样例RE
538985
whatismyname1楼主2021/11/3 21:40
#include<bits/stdc++.h>
using namespace std;
int n,m,p,person[101];
struct classmate
{
	string name;
	int guilty;
}a[21];
map<string,int>day,name;
set<int>criminal;
string t[101];
int main()
{
	day["Monday"]=0;
	day["Tuesday"]=1;
	day["Wednesday"]=2;
	day["Thursday"]=3;
	day["Friday"]=4;
	day["Saturday"]=5;
	day["Sunday"]=6;
	cin>>m>>n>>p;
	for (int i=1;i<=m;i++)
	{
		cin>>a[i].name;
		name[a[i].name]=i;
	}
	getchar();
	for (int i=1;i<=p;i++)
	{
		char c;
		while (c=getchar())
		{
			if (c=='\n')break;
			t[i]+=c;
		}
		int j=0;
		while (t[i][j]!=':')j++;
		person[i]=name[t[i].substr(0,j)];
		t[i]=t[i].substr(j+2);
	}
	for (int i=2;i<=(1<<(m+1));i+=2)
	{
		int cnt=0;
		int ab=i>>1;
		while (ab)
		{
			if (ab&1)cnt++;
			ab>>=1;
		}
		if (cnt!=n)continue;
		int days[7]={0,0,0,0,0,0,0};
		for (int j=1;j<=m;j++)a[j].guilty=0;
		for (int j=1;j<=p;j++)
		{
			int people=person[j];
			vector<string>v;
			int sz=t[j].size(),lst=0;
			for (int k=0;k<sz;k++)
				if (t[j][k]==' ')
				{
					v.push_back(t[j].substr(lst,k-lst));
					lst=k+1;
				}
			v.push_back(t[j].substr(lst));
			if (v[0]=="I")
			{
				if (v[1]=="am")
				{
					if (v[2]=="guilty.")
					{
						if (i&(1<<people))
						{
							if (a[people].guilty==1)
							{
								cout<<"conflict:"<<people<<"'s false self identify\n";
								goto end;
							}
							else
							{
								a[people].guilty=-1;
							}
						}
						else
						{
							if (a[people].guilty==-1)
							{
								cout<<"conflict:"<<people<<"'s true self identify\n";
								goto end;
							}
							else
							{
								a[people].guilty=1;
							}
						}
					}
					else if (v[2]=="not")
					{
						if (v[3]=="guilty.")
						{
							if (i&(1<<people))
							{
								if (a[people].guilty==-1)
								{
									cout<<"conflict:"<<people<<"'s false self wash\n";
									goto end;
								}
								else
								{
									a[people].guilty=1;
								}
							}
							else
							{
								if (a[people].guilty==1)
								{
									cout<<"conflict:"<<people<<"'s true self wash\n";
									goto end;
								}
								else
								{
									a[people].guilty=-1;
								}
							}
						}
					}
				}
			}
			else if (v[0]=="Today")
			{
				if (v[1]=="is")
				{
					if (day[v[2]])
					{
						if (i&(1<<people))
						{
							if (days[day[v[2]]]==1)
							{
								cout<<"conflict:"<<people<<"'s false date\n";
								goto end;
							}
							else
							{
								days[day[v[2]]]=-1;
							}
						}
						else
						{
							if (days[day[v[2]]]==-1)
							{
								cout<<"conflict:"<<people<<"'s true date\n";
								goto end;
							}
							else
							{
								days[day[v[2]]]=1;
							}
						}
					}
				}
			}
			else if (name[v[0]])
			{
				if (v[1]=="is")
				{
					if (v[2]=="guilty.")
					{
						if (i&(1<<people))
						{
							if (a[name[v[0]]].guilty==1)
							{
								goto end;
							}
							else
							{
								a[name[v[0]]].guilty=-1;
							}
						}
						else
						{
							if (a[name[v[0]]].guilty==-1)
							{
								goto end;
							}
							else
							{
								a[name[v[0]]].guilty=1;
							}
						}
					}
					else if (v[2]=="not")
					{
						if (v[3]=="guilty.")
						{
							if (i&(1<<people))
							{
								if (a[name[v[0]]].guilty==-1)
								{
									goto end;
								}
								else
								{
									a[name[v[0]]].guilty=1;
								}
							}
							else
							{
								if (a[name[v[0]]].guilty==1)
								{
									goto end;
								}
								else
								{
									a[name[v[0]]].guilty=-1;
								}
							}
						}
					}
				}
			}
		}
		cnt=0;
		for (int j=1;j<=m;j++)
			if (a[j].guilty==1)
				cnt++;
		if (cnt>1)continue;
		for (int j=1;j<=m;j++)
			if (a[j].guilty==1)
				criminal.insert(j);
end:	;
	}
	if (criminal.empty())cout<<"Impossible";
	else if (criminal.size()>1)cout<<"Cannot Determine";
	else cout<<a[*(criminal.begin())].name;
}
2021/11/3 21:40
加载中...