AtCoder - 2334(搜索)

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 and x.

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 and W.
If ti is S, it indicates that the animal numbered i is a sheep. If ti is W, it indicates that the animal numbered i is a wolf.

Sample Input 1
Copy

6
ooxoox

Sample Output 1
Copy

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.
AtCoder - 2334(搜索)_第1张图片
Sample Input 2
Copy

3
oox

Sample Output 2
Copy

-1

Print -1 if there is no valid assignment of species.
Sample Input 3
Copy

10
oxooxoxoox

Sample Output 3
Copy

SSWWSSSWWS

题意:一些诚实的羊和一些爱说谎的狼围成了一个圈,然后你要判断所有的动物的种类,你可以问一个动物他旁边两个是不是同一种动物,如果它是羊,他就会说实话(比如如果是同一种就会说o,不然说x),而如果是狼就会说谎(也就是如果它两边的两个动物是同一种就会说x,否则说o),现在对所有的动物全都问一遍,如果有一种成立的判断就输出对应的各个动物的种类,否则就输出-1。

题解:因为可以通过一个动物说的话和前一个动物的种类决定下一个动物的种类,所以就枚举前两个动物的种类就好了,一共四种。最后判断一下是否这种判断是否成立就可以了。
(mdzz有一个o特判写成了0,一直只拿到9分,de了好久bug,泪奔,如果比赛时候也这样岂不是凉凉。)

#include
#include
using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
char s[100005];
int ans[100005];
int n,flag;
int check(int i,int x)
{
    int l = i - 1,r = i + 1;
    if(i == 1)l = n;
    if(i == n)r = 1;
    if(x)
    {
        if((s[i] == 'o' && ans[r] != ans[l]) || (s[i] == 'x' && ans[r] == ans[l]))
            return true;
        else return false;
    }
    else
    {
        if((s[i] == 'x' && ans[r] != ans[l]) || (s[i] == 'o' && ans[r] == ans[l]))
            return true;
        else return false;
    }
}
void dfs(int h,int x)//x = 1ÀÇ£¬x = 0Ñò
{
    if(flag)return;
    ans[h] = x;
    if(h > n)return;
    if(h == n && check(n,x) && check(1,ans[1]))
    {
        flag = 1;
        return ;
    }
    if(x)
    {
        if(s[h] == 'o')
        {
            dfs(h + 1,ans[h - 1]^1);
        }
        else {
            dfs(h + 1,ans[h - 1]);
        }
    }
    else {
        if(s[h] == 'o')
        {
            dfs(h + 1,ans[h - 1]);
        }
        else {
            dfs(h + 1,ans[h - 1]^1);
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        scanf("%s",s + 1);
        flag = 0;
        memset(ans,0,sizeof ans);
        ans[1] = 1;
        dfs(2,1);
        if(!flag)
        {
            memset(ans,0,sizeof ans);
            ans[1] = 1;
            dfs(2,0);
        }
        if(!flag)
        {
            memset(ans,0,sizeof ans);
            ans[1] = 0;
            dfs(2,0);
        }
        if(!flag)
        {
            memset(ans,0,sizeof ans);
            ans[1] = 0;
            dfs(2,1);
        }
        if(flag)
        {
            for (int i = 1; i <= n; i++)
            {
                if(ans[i])
                    printf("W");
                else printf("S");
            }
            printf("\n");
        }
        else printf("-1\n");
    }
}

你可能感兴趣的:(o(* ̄︶ ̄*)o搜索,#.#其他)