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
.
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
题意:
给出N只动物,第i只和第i-1,i+1只相邻,(1和N,2相邻,N和N-1,1相邻)
动物的种类只有两种,说真话的羊和说假话的狼,si 为 'o'表示第i只动物说与它相邻的动物为同种动物
si为'x'表示第i只动物说与它相邻的动物为不同种动物,求是否存在动物序列满足给出的si,
存在输出合法的动物序列'S'表示羊,'W'表示狼,不存在输出'-1'
题解:我们可以枚举第一位和第二位,只有四种情况,羊羊,羊狼,狼羊,狼狼,那么由前两个可以推出来第三个,第四个。。。。
最后check一下就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[100005];
int ans[100005],n;
int check(){
int flag=1,i;
for(i=1;i<=n;i++){
int l=i-1,r=i+1;
if(l==0)l=n;
if(r==n+1)r=1;
if(ans[i]==1){
if(s[i]=='o'&&ans[l]!=ans[r])return 0;
if(s[i]=='x'&&ans[l]==ans[r])return 0;
}
else{
if(s[i]=='o'&&ans[l]==ans[r])return 0;
if(s[i]=='x'&&ans[l]!=ans[r])return 0;
}
}
return 1;
}
void work(){
for(int i=2;i<n;i++){
if(ans[i]==1){
if(s[i]=='o')ans[i+1]=ans[i-1];
else ans[i+1]=(ans[i-1]==1?2:1);
}
else{
if(s[i]=='o')ans[i+1]=(ans[i-1]==1?2:1);
else ans[i+1]=ans[i-1];
}
}
}
int main(){
int flag=0,i;
scanf("%d",&n);
scanf("%s",s+1);
ans[1]=ans[2]=1;
work();
if(check()){
for(i=1;i<=n;i++)printf("%c",ans[i]==1?'S':'W');
printf("\n");
return 0;
}
ans[1]=ans[2]=2;
work();
if(check()){
for(i=1;i<=n;i++)printf("%c",ans[i]==1?'S':'W');
printf("\n");
return 0;
}
ans[1]=1;
ans[2]=2;
work();
if(check()){
for(i=1;i<=n;i++)printf("%c",ans[i]==1?'S':'W');
printf("\n");
return 0;
}
ans[2]=1;
ans[1]=2;
work();
if(check()){
for(i=1;i<=n;i++)printf("%c",ans[i]==1?'S':'W');
printf("\n");
return 0;
}
printf("-1\n");
return 0;
}