【玄关】40pts灵异事件求调
查看原帖
【玄关】40pts灵异事件求调
1328579
mairuisheng楼主2025/8/30 17:03

输入数据 #1:

2 1 9
HELLO
GUILTY
HELLO: What is your name?
HELLO: Today is Friday.
HELLO: Today is Monday.
HELLO: Today is Tuesday.
HELLO: Today is Wednesday.
HELLO: Today is Saturday.
HELLO: Today is Sunday.
HELLO: Today is Thursday.
GUILTY: Are you guilty?

正确输出:Impossible

本地输出:Impossible

洛谷 IDE 输出:Impossible

洛谷评测输出:Cannot Determine

评测记录

代码:

//Author: mairuisheng
//#pragma GCC optimize(3)
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
inline int read()
{
	int x=0,f=1;
	char s;
	s=getchar();
	while(s<48||s>57)
	{
		if(s=='-')f=-f;
		s=getchar();
	}
	while(s>47&&s<58)
	{
		x=(x<<3)+(x<<1)+s-48;
		s=getchar();
	}
	return x*f;
}
constexpr int N=21;
struct Node
{
	int opt;
	string xxxxxx;
};
vector<Node> g[N];
unordered_map<string,int> id;
unordered_map<string,int> xq={{"Monday",1},{"Tuesday",2},{"Wednesday",3},{"Thursday",4},{"Friday",5},{"Saturday",6},{"Sunday",7}};
int tot;
int m,n,p;
string s3[N],sna[N];
int ans;
string anss;
bool Check(int per,int day)
{
	int i,j,len,op;
	int cnt=0;
	string xxx;
	int isl;
	for(i=1;i<=m;++i)
	{
		len=g[i].size();
		isl=-1;
		for(j=0;j<len;++j)
		{
			op=g[i][j].opt;
			xxx=g[i][j].xxxxxx;
			if(op==1)
			{
				if(i==per)
				{
					if(isl==0)return false;
					isl=1;
				}
				else
				{
					if(isl==1)return false;
					isl=0;
				}
			}
			else if(op==2)
			{
				if(i!=per)
				{
					if(isl==0)return false;
					isl=1;
				}
				else
				{
					if(isl==1)return false;
					isl=0;
				}
			}
			else if(op==3)
			{
				if(id[xxx]==per)
				{
					if(isl==0)return false;
					isl=1;
				}
				else
				{
					if(isl==1)return false;
					isl=0;
				}
			}
			else if(op==4)
			{
				if(id[xxx]!=per)
				{
					if(isl==0)return false;
					isl=1;
				}
				else
				{
					if(isl==1)return false;
					isl=0;
				}
			}
			else
			{
				if(day==xq[xxx])
				{
					if(isl==0)return false;
					isl=1;
				}
				else
				{
					if(isl==1)return false;
					isl=0;
				}
			}
		}
		if(isl==0)++cnt;
	}
	return cnt==n;
}
int main()
{
	m=read();
	n=read();
	p=read();
	int i,j,lens,len,iid;
	string s,s2;
	for(i=1;i<=m;++i)
	{
		cin>>sna[i];
		id[sna[i]]=++tot;
	}
	scanf("\n");
	while(p--)
	{
		getline(cin,s);
		lens=s.length();
		s2="";
		len=0;
		for(i=0;i<lens;++i)
		{
			if(s[i]==':')
			{
				iid=id[s2];
				s2="";
			}
			else if(s[i]==' ')
			{
				if(s2=="")continue;
				s3[++len]=s2;
				s2="";
			}
			else if(s[i]!='.')s2+=s[i];
		}
		if(s2!="")s3[++len]=s2;
		if(len<3)continue;
		if(s3[2]=="am")
		{
			if(s3[3]=="not")g[iid].push_back({2,""});
			else g[iid].push_back({1,""});
		}
		else if(s3[2]=="is")
		{
			if(s3[3]=="guilty")g[iid].push_back({3,s3[1]});
			else if(s3[3]=="not")g[iid].push_back({4,s3[1]});
			else g[iid].push_back({5,s3[3]});
		}
	}
	for(i=1;i<=m;++i)
	{
		for(j=1;j<8;++j)
		{
			if(Check(i,j))
			{
				anss=sna[i];
				++ans;
				break;
			}
		}
		if(ans==2)
		{
			puts("Cannot Determine");
			return 0;
		}
	}
	if(ans==0)puts("Impossible");
	else cout<<anss;
	return 0;
}

真的不知道哪里出错了,求大佬解答。

2025/8/30 17:03
加载中...