【題解】atcoder2234 Menagerie

題目鏈接

題意:有n只動物圍成一個圈,每隻動物要麼是羊要麼是狼,羊總說真話,狼總說假話。給定一個字符串P,字符串的第i個字符爲'o'代表第i只動物認爲與它相鄰的2只動物是同類,字符串的第i個字符爲'x'代表第i只動物認爲與它相鄰的2只動物是異類。問是否存在一種動物的排列方案使得以上假設成立(羊總說真話,狼總說假話),若存在,給出一種方案。

分析:可以發現,當第1只與第2只動物的類別確定之後,就可以依次確定第3只到第n只動物的類別了,因此只需枚舉前2只動物的類別,再推出第3只到第n只動物的類別,最後判斷該方案是否合法即可。

代碼

#include<bits/stdc++.h>
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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章