玄学,洛谷这是又炸了吗
查看原帖
玄学,洛谷这是又炸了吗
47205
jzy_go楼主2020/8/5 23:30

首先这是我的代码

#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
		f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*f;
}
struct node{
	string s;
	int a;//自己是不是罪犯 
	int b;//指向他人 
	string c;//日期 
}a[10001];
char ch[10001];
int judge[10001];
int f[101][101];
int main()
{
	int m=read();
	int n=read();
	int p=read();
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].s;
		a[i].a=-1;
		a[i].b=-1;
		a[i].c="0";
	}
	int top=0;
	string s1;
	string s2;
	string s3;
	string s4;
		char ch=getchar();
	for(int k=1;k<=p;k++)
	{
		top=-1;
//		ch[++top]=getchar();
//		while(ch[top]!=':')
//		{
//			s1[top-1]=ch[top];
//			ch[++top]=getchar();
//		}
		getline(cin,s4);
//		cout<<s4<<endl;
		s3="0";
		while(s4[++top]!=':');
//		cout<<top<<endl;
		s3=s4.substr(0,top);
//		cout<<s3<<endl;
//		cout<<s1<<endl;
		for(int i=1;i<=m;i++)
		{
//			cout<<a[i].s<<" "<<s3<<endl;
			if(a[i].s==s3)
			{
				s2=s4.substr(top+2,s4.size()-1-top);
//				cout<<s2<<endl;
				for(int j=0;j<=s2.size()-1;j++)
				{
					if(s2[j]>='A'&&s2[j]<='Z')
					{
						s2[j]=s2[j]-('A'-'a');
					}
				}
				if(s2=="i am guilty.")
				a[i].a=1;
				else
				if(s2=="i am not guilty.")
				a[i].a=0;
				else
				if(s2=="today is sunday."||s2=="today is monday."||s2=="today is tuesday."||s2=="today is wednesday."||s2=="today is thursday."||s2=="today is friday."||s2=="today is saturday.")
				a[i].c=s2;
				else
				if(s2.find(" is guilty.")<=s2.size()+1)
				{
					int topp=-1;
					s3="0";
					while(s2[++topp]!=' ')
					{
						if(s2[topp]>='a'&&s2[topp]<='z')
						{
							s2[topp]=s2[topp]-('a'-'A');
						}
					}
					s3=s2.substr(0,topp);
//					cout<<s3<<endl;
					for(int j=1;j<=m;j++)
					{
						if(a[j].s==s3)
						a[i].b=j;
					}
				}
			}
		}
	}
	int cnt;
	int ans=-2;
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i!=j)
			{
				if(a[i].c!=a[j].c&&(a[i].c!="0"&&a[j].c!="0"))
				{
					f[i][j]=1;
				}
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		bool flag=0;
		for(int j=1;j<=m;j++)
		judge[j]=-1;
		for(int j=1;j<=m;j++)
		{
			if(a[j].a==1&&j!=i)
			{
				if(judge[j]==0)
				{
					flag=1;
					break;
				}
				judge[j]=1;
				bool flagg=0;
				for(int k=1;k<=m;k++)
				if(f[j][k])
				{
					if(judge[k]==1)
					{
						flag=1;
						flagg=1;
						break;
					}
					judge[k]=0;
				}
				if(flagg)
				break;
			}
			if(a[j].a==1&&j==i)
			{
				if(a[j].b==i||a[j].b==-1)
				{
					if(judge[j]==1)
					{
						flag=1;
						break;
					}
					judge[j]=0;
					bool flagg=0;
					for(int k=1;k<=m;k++)
					if(f[j][k])
					{
						if(judge[k]==0)
						{
							flag=1;
							flagg=1;
							break;
						}
						judge[k]=1;
					}
					if(flagg)
					break;
				}
				else
				{
					if(judge[j]==0)
					{
						flag=1;
						break;
					}
					judge[j]=1;
					bool flagg=0;
					for(int k=1;k<=m;k++)
					if(f[j][k])
					{
						if(judge[k]==1)
						{
							flag=1;
							flagg=1;
							break;
						}
						judge[k]=0;
					}
					if(flagg)
					break;
				}
			}
			if(a[j].a==0&&j==i)
			{
				if(judge[j]==0)
					{
						flag=1;
						break;
					}
					judge[j]=1;
					bool flagg=0;
					for(int k=1;k<=m;k++)
					if(f[j][k])
					{
						if(judge[k]==1)
						{
							flag=1;
							flagg=1;
							break;
						}
						judge[k]=0;
					}
					if(flagg)
					break;
			}
			if(a[j].a==0&&j!=i)
			{
				if(a[j].b==i||a[j].b==-1)
				{
					if(judge[j]==1)
					{
						flag=1;
						break;
					}
					judge[j]=0;
					bool flagg=0;
					for(int k=1;k<=m;k++)
					if(f[j][k])
					{
						if(judge[k]==0)
						{
							flag=1;
							flagg=1;
							break;
						}
						judge[k]=1;
					}
					if(flagg)
					break;
				}
				else
				{
					if(judge[j]==0)
					{
						flag=1;
						break;
					}
					judge[j]=1;
					bool flagg=0;
					for(int k=1;k<=m;k++)
					if(f[j][k])
					{
						if(judge[k]==1)
						{
							flag=1;
							flagg=1;
							break;
						}
						judge[k]=0;
					}
					if(flagg)
					break;
				}
				
			}
			if(a[j].b!=i&&a[j].b!=-1)
			{
				if(judge[j]==0)
				{
					flag=1;
					break;
				}
				judge[j]=1;
				bool flagg=0;
				for(int k=1;k<=m;k++)
				if(f[j][k])
				{
					if(judge[k]==1)
					{
						flag=1;
						flagg=1;
						break;
					}
					judge[k]=0;
				}
				if(flagg)
				break;
			}
			if(a[j].b==i)
			{
				if(judge[j]==1)
				{
					flag=1;
					break;
				}
				judge[j]=0;
				bool flagg=0;
				for(int k=1;k<=m;k++)
				if(f[j][k])
				{
					if(judge[k]==0)
					{
						flag=1;
						flagg=1;
						break;
					}
					judge[k]=1;
				}
				if(flagg)
				break;
			}
		}
		if(flag!=1)
		{
			cnt=0;
			for(int j=1;j<=m;j++)
			if(judge[j]==-1)
			{
				ans=max(-2,ans);
				cnt=-1;
				break;
			}
//		cout<<ans<<endl;
			if(cnt==-1)
			continue;
			for(int j=1;j<=m;j++)
			{
				if(judge[j]==1)
				cnt++;
			}
			if(cnt==n)
			{
				if(ans<=0)
				ans=i;
				else
				{
					ans=-1;
					break;
				}
			}
		}
	}
//	for(int i=1;i<=m;i++)
//	{
//		cout<<a[i].a<<" "<<a[i].b<<" "<<a[i].c<<endl;
//	}
	if(ans==-2)
	cout<<"Impossible"<<endl;
	if(ans==-1)
	cout<<"Cannot Determine"<<endl;
	if(ans>=0)
	cout<<a[ans].s<<endl;
//	cout<<ans<<endl;
	return 0;
}

然后这是数据(第一个点)

2 2 4
HELLO
GUILTY
HELLO: What is your name?
GUILTY: I am GUILTY.
GUILTY: Are you guilty?
HELLO: I am not guilty.

答案是HELLO

在本地上我的程序正常运行,答案正确。

提交到洛谷上却告诉我我的程序输出的以I开头,WA掉了

???谁来帮帮我

2020/8/5 23:30
加载中...