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