题意:有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;
}