题意大概:
有一圈动物包括狼和羊,每个动物say ‘o’ 或者‘x’ ; 'o'代表say‘o'的动物说他两边的动物是相同的,’x'代表 say‘x'的动物说他两边的动物是不同的; 当然 他们说的不全是对的 羊说的是真话,狼说的是假话, 根据输入的 动物们说的’x‘,’o‘ 推出狼和羊的排列位置。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<stack>
using namespace std;
bool vis[220010];
char s[220010];
bool check(int x, int y, int len)
{
vis[0]=x;
vis[1]=y;
for(int i=2; i<=len+1; i++)
{
//如果[i-1]为羊,那么它说的就是真话;
if(vis[i-1])
{
//如果[I-1]说的'o',则他前一个跟后一个相等,即一样;
if(s[i-1]=='o')
vis[i]=vis[i-2];
//如果[i-1]说的'x',则他的前一个跟后一个不相等,即不一样;
else
vis[i]=!vis[i-2];
}
//如果[I-1]为狼,那么他说的就是假话;
else
{
//如果[I-1]说的'o',则他的前一个跟后一个不相等,即不一样;
if(s[i-1]=='o')
vis[i]=!vis[i-2];
//如果[I-1]说的'x',则他的前一个跟后一个相等,即一样;
else
vis[i]=vis[i-2];
}
}
//如果通过上边递推,如果推出了[len]==[0],[len+1]==[1];则说明假设的前两个动物狼羊的情况正确;
if(vis[len]==vis[0]&&vis[len+1]==vis[1])
{
for(int i=0;i<len;i++)
{
//如果vis[i]为1,即[i]为羊;
if(vis[i])
printf("S");
//如果vis[i]为0,即[i]为狼;
else
printf("W");
}
puts("");
return 1;
}
return 0;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
scanf("%s",s);
int len=n;
//因为是个圈 共有len个动物,数组标号到[len-1],
为了判断第一个和最后一个,定义[len]=[0],[len+1]=[1],[len+2]记为结束;
s[len]=s[0];
s[len+1]=s[1];
s[len+2]='\0';
bool fl=0;
//通过循环,遍历前两个 的 四种组合情况:狼狼 羊羊 狼羊 羊狼;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
if(check(i,j,len))
{
fl=1;
break;
}
}
if(fl)
break;
}
if(!fl)
puts("-1\n");
}
return 0;
}