题目链接:http://abc055.contest.atcoder.jp/tasks/arc069_b?lang=en
D - Menagerie
Time limit : 2sec / Memory limit : 256MB
Score : 500 points
Problem Statement
Snuke, who loves animals, built a zoo.
There are N animals in this zoo. They are conveniently numbered 1 through N, and arranged in a circle. The animal numbered i(2≤i≤N−1) is adjacent to the animals numbered i−1 and i+1. Also, the animal numbered 1 is adjacent to the animals numbered 2 and N, and the animal numbered N is adjacent to the animals numbered N−1 and 1.
There are two kinds of animals in this zoo: honest sheep that only speak the truth, and lying wolves that only tell lies.
Snuke cannot tell the difference between these two species, and asked each animal the following question: "Are your neighbors of the same species?" The animal numbered i answered si. Here, if si is o
, the animal said that the two neighboring animals are of the same species, and if si is x
, the animal said that the two neighboring animals are of different species.
More formally, a sheep answered o
if the two neighboring animals are both sheep or both wolves, and answered x
otherwise. Similarly, a wolf answered x
if the two neighboring animals are both sheep or both wolves, and answered o
otherwise.
Snuke is wondering whether there is a valid assignment of species to the animals that is consistent with these responses. If there is such an assignment, show one such assignment. Otherwise, print -1
.
Constraints
- 3≤N≤105
- s is a string of length N consisting of
o
andx
.
Input
The input is given from Standard Input in the following format:
N s
Output
If there does not exist an valid assignment that is consistent with s, print -1
. Otherwise, print an string t in the following format. The output is considered correct if the assignment described by t is consistent with s.
- t is a string of length N consisting of
S
andW
. - If ti is
S
, it indicates that the animal numbered i is a sheep. If ti isW
, it indicates that the animal numbered i is a wolf.
Sample Input 1
6 ooxoox
Sample Output 1
SSSWWS
For example, if the animals numbered 1, 2, 3, 4, 5 and 6 are respectively a sheep, sheep, sheep, wolf, wolf, and sheep, it is consistent with their responses. Besides, there is another valid assignment of species: a wolf, sheep, wolf, sheep, wolf and wolf.
Let us remind you: if the neiboring animals are of the same species, a sheep answers o
and a wolf answers x
. If the neiboring animals are of different species, a sheep answers x
and a wolf answers o
.
![b34c052fc21c42d2def9b98d6dccd05c.png](https://atcoder.jp/img/arc069/b34c052fc21c42d2def9b98d6dccd05c.png)
Sample Input 2
3 oox
Sample Output 2
-1
Print -1
if there is no valid assignment of species.
Sample Input 3
10 oxooxoxoox
Sample Output 3
SSWWSSSWWS
题意:动物园中只有狼和羊, 狼羊做成一个圈,输入一个字符串,如果是羊,表示真话,串中'o'表示是它的左右为同一物种,‘x’表示不同物种,如果是狼则相反,,问是否存在一种可能,满足上面的字符串,最后输出1-n位置的狼和羊
解析:刚看到这个题时,完全懵逼,这TM怎么模拟,后来看泰神博客才知道怎么写,就是枚举前两个动物,得出一个序列,判断下是否成立,成立的话输出即可,复杂度为4*n,就是O(n)
代码:
#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;
}