【题解】atcoder2234 Menagerie

题目链接

题意:有n只动物围成一个圈,每只动物要么是羊要么是狼,羊总说真话,狼总说假话。给定一个字符串P,字符串的第i个字符为'o'代表第i只动物认为与它相邻的2只动物是同类,字符串的第i个字符为'x'代表第i只动物认为与它相邻的2只动物是异类。问是否存在一种动物的排列方案使得以上假设成立(羊总说真话,狼总说假话),若存在,给出一种方案。

分析:可以发现,当第1只与第2只动物的类别确定之后,就可以依次确定第3只到第n只动物的类别了,因此只需枚举前2只动物的类别,再推出第3只到第n只动物的类别,最后判断该方案是否合法即可。

代码

#include
using namespace std;
const int maxn=1e5+10;
int n,ans[maxn];
char ch[maxn];
bool check()
{
	if (!ans[n])
	{
		if (ch[n]=='o'&&ans[n-1]!=ans[1]) return 0;
		if (ch[n]=='x'&&ans[n-1]==ans[1]) return 0;
	}
	else
	{
		if (ch[n]=='x'&&ans[n-1]!=ans[1]) return 0;
		if (ch[n]=='o'&&ans[n-1]==ans[1]) return 0;
	}
	if (!ans[1])
	{
		if (ch[1]=='o'&&ans[n]!=ans[2]) return 0;
		if (ch[1]=='x'&&ans[n]==ans[2]) return 0;
	}
	else
	{
		if (ch[1]=='x'&&ans[n]!=ans[2]) return 0;
		if (ch[1]=='o'&&ans[n]==ans[2]) return 0;
	}
	return 1;
}
int main()
{
	scanf("%d%s",&n,ch+1);
	for (int S=0;S<4;S++)
	{
		ans[1]=S&1;
		ans[2]=(S>>1)&1;
		for (int i=3;i<=n;i++)
		    if (!ans[i-1])
		    {
		    	if (ch[i-1]=='o') ans[i]=ans[i-2];
		    	else ans[i]=ans[i-2]^1;
			}
			else
			{
				if (ch[i-1]=='x') ans[i]=ans[i-2];
		    	else ans[i]=ans[i-2]^1;
			}
		if (check())
		{
			for (int i=1;i<=n;i++)
			    if (!ans[i]) printf("S");
			    else printf("W");
			return 0;
		}
	}
	cout<<"-1";
	return 0;
}


你可能感兴趣的:(解题报告,构造)