题目链接
题目大意:现在有狼和羊共N个围成一个圈,然后他们每个人都会告诉你他们两边的动物是不是一样的动物,是的话就是O,不是的话就是X,现在问你他们的的可能的序列是啥。没有的话就输出-1
思路:其实这个题目的话并不需要完全的一个个的宝暴力枚举,我们只需要知道两个基本上就可以根据他给出的信息从而全部枚举出来,然后判断是不是每一个都是正确的。如果有不正确的就跳下一个,所有动物站成一圈,我们可以由最后两个动物推出第一个动物的情况,进而由最后一个动物和第一个动物推出第二个动物的情况,
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#define N 100009
using namespace std;
const int INF = 0x3f3f3f3f;
char s[N];
int ans[N];
int nx[4] = {1, 1, 0, 0};
int ny[4] = {1, 0, 0, 1};
bool check(int a, int b, int n)
{
ans[0] = a; ans[1] = b;
for(int i = 1; i < n - 1; i++)
{
if(s[i] == 'o')
{
if(ans[i]) ans[i + 1] = ans[i - 1];
else ans[i + 1] = !ans[i - 1];
}
else
{
if(ans[i]) ans[i + 1] = !ans[i - 1];
else ans[i + 1] = ans[i - 1];
}
}
if(s[0] == 'o')
{
if(ans[0])
{
if(ans[1] != ans[n - 1]) return false;
}
else if(ans[1] == ans[n - 1]) return false;
}
else
{
if(ans[0])
{
if(ans[1] == ans[n - 1]) return false;
}
else if(ans[1] != ans[n - 1]) return false;
}
if(s[n - 1] == 'o')
{
if(ans[n - 1])
{
if(ans[0] != ans[n - 2]) return false;
}
else if(ans[0] == ans[n - 2]) return false;
}
else
{
if(ans[n - 1])
{
if(ans[0] == ans[n - 2]) return false;
}
else if(ans[0] != ans[n - 2]) return false;
}
return true;
}
int main()
{
int n;
scanf("%d %s", &n, s);
for(int i = 0; i < 4; i++)
{
if(check(nx[i], ny[i], n))
{
for(int i = 0; i < n; i++)
{
if(ans[i]) printf("S");
else printf("W");
}
printf("\n");
exit(0);
}
}
puts("-1");
return 0;
}