洛谷题解 | AT_arc069_b [ABC055D] Menagerie

news/2024/7/8 3:05:57 标签: 题解, 洛谷

目录

    • 题面翻译
    • 题目描述
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 样例 #3
      • 样例输入 #3
      • 样例输出 #3
    • 提示
      • 制約
      • Sample Explanation 1
      • Sample Explanation 2
    • 题目思路
      • 解法一
      • 解法二
    • AC 代码
      • 解法一
      • 解法二

题面翻译

题目描述

Snuke,一个喜欢动物的人,建立了一个动物园。

一共有n个动物在动物园中,编号 1 − n 1-n 1n ,被按顺序围成一个圈。

有两种动物:诚实的羊只说真话,不诚实的狼只说假话。

Snuke无法区别这两种动物,他问每只动物以下问题:“你旁边的两只动物是同一种吗?”第i只动物的答案为 S i Si Si 。如果 S i Si Si 为“o”,则表示相同,“x”则相反。

此外,若羊回答“o”,相邻的生物则都是羊或都是狼,而“x”则相反。若狼回答“x”,相邻的生物则都是羊或狼,而“o”则相反。

Snuke想知道是否有一种可行的排列方式。如果有,输出这种排列。如果没有,则输出“-1”。

注:“S”表示羊,“W”表示狼。

题目描述

すぬけくんは動物が好きなので動物園を作りました。

この動物園では $ 1,2,3,\ …,\ N $ の番号を割り振られた $ N $ 匹の動物が円環状に並べられています。 $ i\ (2≦i≦N-1) $ 番の動物は $ i-1 $ 番の動物と $ i+1 $ 番の動物と隣り合っています。また、$ 1 $ 番の動物は $ N $ 番の動物と $ 2 $ 番の動物と隣り合っており、$ N $ 番の動物は $ N-1 $ 番の動物と $ 1 $ 番の動物と隣り合っています。

動物園には本当のことしか言わない正直者の羊と、嘘しか言わない嘘つきの狼の 2 種類の動物がいます。

すぬけくんには羊と狼の区別がつかないので、それぞれの動物に両隣の動物が同じ種類かどうかを訪ねたところ、$ i $ 番目の動物は $ s_i $ と答えました。$ s_i $ が o ならば両隣の動物が同じ種類であると、x ならば異なる種類であると $ i $ 番の動物が言ったことを示します。

より形式的には、羊は両隣の動物がどちらも羊あるいはどちらも狼のとき o と答え、そうでないとき x と答えます。 狼は両隣の動物がどちらも羊あるいはどちらも狼のとき x と答え、そうでないとき o と答えます。

これらの回答結果と矛盾しないような各動物の種別の割り当てが存在するか、すぬけくんは気になっています。存在するならば一例を示し、存在しないならば -1 を出力しなさい。

输入格式

入力は以下の形式で標準入力から与えられる。

$ N $ $ s $

输出格式

$ s $ と矛盾しないような各動物の種類の割当てが存在しないならば -1 を出力してください。 存在するならば以下の形式で文字列 $ t $ を出力してください。 $ t $ で示される割り当てが $ s $ と矛盾しないならば正解となります。

  • $ t $ は長さ $ N $ で SW のみからなる文字列
  • $ t_i $ が S ならば $ i $ 番の動物が羊であることを、W ならば狼であることを示す

样例 #1

样例输入 #1

6
ooxoox

样例输出 #1

SSSWWS

样例 #2

样例输入 #2

3
oox

样例输出 #2

-1

样例 #3

样例输入 #3

10
oxooxoxoox

样例输出 #3

SSWWSSSWWS

提示

制約

  • $ 3\ ≦\ N\ ≦\ 10^{5} $
  • $ s $ は ox のみからなる長さ $ N $ の文字列

Sample Explanation 1

例えば $ 1,2,3,4,5,6 $ 番の動物がそれぞれ羊、羊、羊、狼、狼、羊であるとき発言と矛盾しません。その他、狼、羊、狼、羊、狼、狼であるようなときも矛盾しません。 両隣が同じ種類の動物のとき羊は o と発言し、狼は x と発言すること、 両隣が異なる種類の動物のとき羊は x と発言し、狼は o と発言することに注意してください。 ![b34c052fc21c42d2def9b98d6dccd05c.png](https://atcoder.jp/img/arc069/b34c052fc21c42d2def9b98d6dccd05c.png)

Sample Explanation 2

存在しない場合は -1 を出力してください。

题目思路

解法一

首先读取输入,然后通过循环遍历输入的字符串,将每个字符代表的动物按其类型放入数组中。

接着,再创建一个数组,用于存储每只动物的回答。通过一个四重循环来模拟每只动物的回答过程。

如果找到了满足条件的排列,就通过遍历数组并将其转换为字符串输出。

如果没有找到满足条件的排列,输出 -1 \texttt{-1} -1

解法二

首先读取输入,然后开始遍历所有可能的动物园排列。如果某只动物的回答和它旁边的两只动物的回答相同,则这只动物是羊;如果不同,则这只动物是狼。

接着,判断动物园的排列是否满足题目中的条件。

如果某一种排列通过了所有的判断,则输出这种排列。如果没有找到满足条件的排列,则输出 -1 \texttt{-1} -1

AC 代码

解法一

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define pf push_front
#define mp make_pair
#define fi first
#define se second
#define All(s) s.begin(),s.end()
#define rAll(s) s.rbegin(),s.rend()
#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
typedef long long lint;
typedef complex <double> P;
typedef pair <int,int> pint;
int out[114514],pat[114514];
string s;
string sw="SW";
int n;
int main()
{
	cin >> n >> s;
	rep(i,n){
		if(s[i] == 'o') pat[i] = 0;else pat[i] = 1;
	}
	pat[n] = pat[0];
	pat[n + 1] = pat[1];
	rep(i,4){
		out[0] = i / 2;out[1] = i % 2;
		REP(j,1,n+1){
			out[j + 1] = (pat[j] + out[j] + out[j - 1]) % 2;
		}
		if(out[0] == out[n] && out[1] == out[n + 1]){
			string ret = "";
			rep(j,n) ret += sw[out[j]];
			cout << ret << endl;
			return 0;
		}
	}
	cout << -1 << endl;
}

解法二

#include <bits/stdc++.h>
using namespace std;
typedef signed long long ll;
#undef _P
#define _P(...) (void)printf(__VA_ARGS__)
#define FOR(x,to) for(x=0;x<(to);x++)
#define FORR(x,arr) for(auto& x:arr)
#define ITR(x,c) for(__typeof(c.begin()) x=c.begin();x!=c.end();x++)
#define ALL(a) (a.begin()),(a.end())
#define ZERO(a) memset(a,0,sizeof(a))
#define MINUS(a) memset(a,0xff,sizeof(a))
int N;
string S;
string T;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin >> N >> S;
	FOR(i,4) {
		if(i == 0) T = "SS";
		if(i == 1) T = "SW";
		if(i == 2) T = "WS";
		if(i == 3) T = "WW";
		for(j = 1;j < N - 1;j++) {
			if((T[j] == 'S') ^ (S[j] == 'o')){
				T.push_back('S' + 'W' - T[j - 1]);
			}
			else {
				T.push_back(T[j - 1]);
			}
		}
		
		if((T[N - 1] == 'S') ^ (S[N - 1] == 'o')){
			if(T[N - 2] == T[0]) continue;
		}
		else {
			if(T[N - 2] != T[0]) continue;
		}
		if((T[0] == 'S') ^ (S[0] == 'o')){
			if(T[N - 1] == T[1]) continue;
		}
		else {
			if(T[N-1] != T[1]) continue;
		}
		cout << T << endl;
		return;
		
	}
	cout << -1 << endl;
	
}
int main(int argc,char** argv){
	string s;
   int i;
	if(argc == 1) ios::sync_with_stdio(false), cin.tie(0);
	FOR(i,argc-1) s += argv[i + 1],s += '\n';
	FOR(i,s.size()) ungetc(s[s.size() - 1 - i],stdin);
	solve();
   return 0;
}

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,如果喜欢我的文章,给个关注吧!

冰焰狼 | 文

如果本篇博客有任何错误,请批评指教,不胜感激 !


http://www.niftyadmin.cn/n/5112802.html

相关文章

剑指Offer || 054.把二叉搜索树转换为累加树

题目 给定一个二叉搜索树&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也…

【Hive SQL 每日一题】环比增长率、环比增长率、复合增长率

文章目录 环比增长率同比增长率复合增长率测试数据需求说明需求实现 环比增长率 环比增长率是指两个相邻时段之间某种指标的增长率。通常来说&#xff0c;环比增长率是比较两个连续时间段内某项数据的增长量大小的百分比。 环比增长率反映了两个相邻时间段内某种经济指标的变…

KubeSphere安装KubeEdge

1. kubesphere安装请参考博客 2. 配置master节点 控制台->平台管理->集群管理->自定义CRD&#xff0c;搜索​​clusterconfiguration​​&#xff0c;查看详情&#xff0c;在资源列表中&#xff0c;点击 ​​ks-installer​​ 右侧的图标&#xff0c;然后选择编辑配…

关于计算机找不到vcomp140.dll无法继续执行怎么修复

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是vcomp140.dll文件丢失。vcomp140.dll是一个动态链接库文件&#xff0c;它通常用于支持软件运行和系统功能。当这个文件丢失时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至系统出现错…

Docker概述、部署、镜像与容器管理

Docker概述、部署、镜像与容器操作 一、Docker是什么&#xff1f;1.1、Docker介绍1.2、Docker的设计宗旨1.3、容器运行条件1.4、容器与虚拟机的区别1.5、Docker核心概念1.5.1、镜像1.5.2、容器1.5.3、仓库 二、Docker部署三、Docker 镜像管理3.1、搜索镜像3.2、查看仓库中有哪些…

局域网下多台windows电脑时间同步

windows时间同步 最近在项目中遇见了多台windows电脑的时间同步问题。在这个项目中&#xff0c;有五台电脑&#xff0c;五台电脑处于同一局域网下&#xff0c;其中有一台可以连接互联网&#xff08;A电脑&#xff09;。我需要将其他四台电脑&#xff08;B、C、D、E电脑&#xf…

NetSuite SuiteWorld 2023观后感

25年&#xff01;本周结束的SuiteWorld 2023是NetSuite的25周年庆。 下面两张照片分别来自1998年和今年。同样的人&#xff0c;同样的地点。左二是Evan&#xff0c;NetSuite的主要创始人。 当Evan展望未来25年后NetSuite这四位创始人的样子时。Evan GPT&#xff0c;给出了如下…

【Java基础面试三十八】、请介绍Java的异常接口

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;请介绍Java的异常接口 …