atcoder 055D D - Menagerie

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_stage/article/details/77720965

http://abc055.contest.atcoder.jp/tasks/arc069_b

题意: 一圈动物,有真诚的羊和套路的狼,羊说真话,狼说假话。 这些动物围成一圈,之后输入n,表示长度为n的字符串,输出只包含o,x的字符串,对于羊而言o表示他左右两边的动物和他一样,x表示左右两边的动物至少有一个和他不一样。 对于狼而言o表示左右两边的动物至少有一个和他不一样,x表示左右两边的动物和他一样。问你是否有满足这样条件的序列,如果有输出任意一个,否则输出-1

思路:
这个题挺无聊的,因为一开始我老想DFS处理所有狼和羊的情况,但好像代码量和判断条件过于复杂就放弃了。之后我想我可以假设两个的情况,这样我可以推第3个,之后第四个,依次类推到第n个。这样我每次推完就可以判定是否满足条件。

#include <bits/stdc++.h>
#define maxs 220020
#define mme(i,j) memset(i,j,sizeof(i))
#define ll long long
using namespace std;
bool vis[maxs];
char s[maxs];
bool check(int x,int y,int len){
    vis[0]=x;
    vis[1]=y;
    for(int i=2;i<=len+1;i++){
        if(vis[i-1]){
            if(s[i-1]=='o') vis[i]=vis[i-2];
            else vis[i]=!vis[i-2];
        }else{
            if(s[i-1]=='o') vis[i]=!vis[i-2];
            else vis[i]=vis[i-2];
        }
    }
    if(vis[len]==vis[0]&&vis[len+1]==vis[1]){
        for(int i=0;i<len;i++){
            if(vis[i])
                printf("S");
            else
                printf("W");
        }
        puts("");
        return 1;
    }
    return 0;
}

int main()
{
    int n;
    while(~scanf("%d",&n)){
        scanf("%s",s);
        int len=n;
        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");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/My_stage/article/details/77720965