社区讨论

60pts求助

P1092[NOIP 2004 提高组] 虫食算参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lz2fx5pb
此快照首次捕获于
2024/07/26 16:28
2 年前
此快照最后确认于
2024/07/26 17:38
2 年前
查看原帖
rt,#5 #7 #8 WA #9 TLE
CPP
#include <bits/stdc++.h>
#define l long long
#define re register
#define rl re l
#define cin std::cin
#define printf std::printf
using namespace std;
string a,b,s;
bool flag=0;
l n,p[1006];
bool bb[27];
void dfs(l st,l le)
{
	if(flag) return ;
	if(st==0)
	{
		for(char i='A';i<'A'+n;i++)
		{
			printf("%lld ",p[i]);
		}
		flag=1;
		return ;
	}
	if(p[a[st]]==1000)
	{
		if(p[s[st]]!=1000&&p[b[st]]!=1000)
		{
			l t=p[s[st]]-le-p[b[st]];
			if(t<0)
			{
				t+=n;
			}
			if(bb[t])
			{
				return ;
			}
			else
			{
				bb[t]=1;
				p[a[st]]=t;
				dfs(st,le);
				bb[t]=0;
				p[a[st]]=1000;
			}
		}
		else
		for(rl i=0;i<n;i++)
		{
			if(!bb[i])
			{
				bb[i]=1;
				p[a[st]]=i;
				dfs(st,le);
				bb[i]=0;
				p[a[st]]=1000;
			}
		}
	}
	if(p[b[st]]==1000)
	{
		if(p[s[st]]!=1000&&p[a[st]]!=1000)
		{
			l t=p[s[st]]-le-p[a[st]];
			if(t<0)
			{
				t+=n;
			}
			if(bb[t])
			{
				return ;
			}
			else
			{
				bb[t]=1;
				p[b[st]]=t;
				dfs(st,le);
				bb[t]=0;
				p[b[st]]=1000;
			}
		}
		else
		for(rl i=0;i<n;i++)
		{
			if(!bb[i])
			{
				bb[i]=1;
				p[b[st]]=i;
				dfs(st,le);
				bb[i]=0;
				p[b[st]]=1000;
			}
		}
	}
	if(p[s[st]]==1000)
	{
		if(bb[(p[a[st]]+p[b[st]]+le)%n])
		{
			return ;
		}
		else
		{
			bb[(p[a[st]]+p[b[st]]+le)%n]=1;
			p[s[st]]=(p[a[st]]+p[b[st]]+le)%n;
			dfs(st,le);
			bb[(p[a[st]]+p[b[st]]+le)%n]=0;
			p[s[st]]=1000;
		}
	}
	if(p[s[st]]==1000||p[b[st]]==1000||p[a[st]]==1000) return ;
	if(st==1&&p[a[st]]+p[b[st]]+le>=n) return ;
	if(p[a[st]]+p[b[st]]+le==p[s[st]])
	{
		dfs(st-1,0);
	}
	else if((p[a[st]]+p[b[st]]+le)%n==p[s[st]])
	{
		dfs(st-1,1);
	}
	else
	{
		return ;
	}
}
void mian()
{
	cin>>n;
	cin>>a>>b>>s;
	for(char i='A';i<='Z';i++)
	{
		p[i]=1000;
	}
	a=" "+a,b=" "+b,s=" "+s;
	dfs(n,0);
}
int main()
{
	mian();
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...