专栏文章

题解:P12443 [NERC2023] LOL Lovers

P12443题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip7dnsp
此快照首次捕获于
2025/12/03 07:22
3 个月前
此快照最后确认于
2025/12/03 07:22
3 个月前
查看原文

题解:P12443 [NERC2023] LOL Lovers

题目大意

给定一个长度为 nn 的字符串,字符串中只会包含下列两种字符。
  • 用字母 O\texttt{O} 表示洋葱。
  • 用字母 L\texttt{L} 表示面包。
按照以下要求输出 kk
  • kk 分开,字符串前缀的洋葱和面包的数量不等于后缀洋葱和面包的数量,并且前缀、后缀的长度至少为 11
  • 如果不存在一个合法的 kk,输出 1-1
  • 数字 kk 可以为任意数,但必须满足要求。

思路

由于 kk 没有太多的限制,因此我们如果找到了一个合法的位置,直接输出该位置即可。
遍历结束,不存在合法的答案,代码结尾应输出 1-1
设前缀为 00i1i-1,后缀为 iin1n-1,我们只需用循环处理前缀、后缀中字母 O\texttt{O}L\texttt{L} 的数量,然后比较即可。

代码

CPP
#include <bits/stdc++.h>
using namespace std;

int main() {
    int left_o, left_l, right_o, right_l, n;
	string s;
	cin >> n >> s;
	for (int i = 1; i <= n - 1; i++) { //遍历字符串的每一位
		left_o = 0, left_l = 0, right_o = 0, right_l = 0; //初始化
		for (int j = 0; j <= i - 1; j++) { //统计前缀
			if (s[j] == 'O') {
				left_o++;
			} else {
				left_l++;
			}
		}
		for (int j = i; j <= n - 1; j++) { //统计后缀
			if (s[j] == 'O') {
				right_o++;
			} else {
				right_l++;
			}
		}
		if (left_o != right_o && left_l != right_l && left_o + left_l > 0 && right_o + right_l > 0) {
            //如果前、后缀字母O和L的数量不等
			cout << i; //输出该位置
			return 0; //结束程序
		}
	}
	cout << -1; //不可能存在答案
	return 0; //完结
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...