专栏文章
AtCoder Beginner Contest 381 A~C
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqjoxta
- 此快照首次捕获于
- 2025/12/04 05:54 3 个月前
- 此快照最后确认于
- 2025/12/04 05:54 3 个月前
A - 11/22 String
题目
本问题中 11/22 字符串的定义与问题 C 和 E 中的定义相同。
满足以下所有条件的字符串 称为 11/22 字符串:
- 是奇数。这里, 表示 的长度。
- 从 到 的字符都是
1。 - 第 个字符是
/。 - 从 到 的字符都是
2。
例如,
11/22、111/222 和 / 是 11/22 字符串,但 1122、1/222、11/222、22/11 和 /2/2/211 则不是。给定长度为 的字符串 由
1、2 和 / 组成,请判断 是否是 11/22 字符串。代码
CPP#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
scanf("%d", &t);
cin >> s;
if (t % 2 == 0 || s[(t + 1) / 2 - 1] != '/')
goto it;
for (int i = 0; i < (t + 1) / 2 - 1; i ++ )
{
if (s[i] != '1')
goto it;
}
for (int i = (t + 1) / 2; i < (int)s.length(); i ++ )
{
if (s[i] != '2')
goto it;
}
puts("Yes");
return 0;
it:
puts("No");
return 0;
}
B - 1122 String
题目
当且仅当字符串 满足以下三个条件时,它才被称为 1122 字符串:
- 是偶数。这里, 表示 的长度。
- 对于满足 的每个整数 , 的第 个和第 个字符都相等。
- 每个字符在 中出现的次数正好是 0 或 2。也就是说, 中包含的每个字符在 中恰好出现两次。
给定一个由小写英文字母组成的字符串 ,如果 是一个 1122 字符串,则打印
Yes,否则打印 No。思路
只需检查给定字符串是否满足 1122 字符串的三个条件即可。
第三个条件可以以任何方式重新表述,例如,只要满足第一个和第二个条件,我们就可以使用这种重新表述的条件。这里, 表示 的第 个字符。
- 都是不同的。
- 对于 的每个字符 , 中恰好有两个元素与之重合。 也就是说,对于介于 和 之间的所有整数 ,恰好有两个索引 与之重合。 与 重合。
原解的复杂度为 。这里, 是 中可能使用的不同字符数;这次是 。在重新表述的条件中,天真的实现可能会花费 时间,但在我们的例子中是 ,这是可以接受的。因此,可以用任何方法检查该条件,问题也就迎刃而解了。
代码
CPP#include <bits/stdc++.h>
using namespace std;
int n, cnt[26];
string s;
int main()
{
cin >> s;
n = s.length();
if (s.length() % 2 == 1)
{
puts("No");
return 0;
}
for (int i = 0; i < (n / 2); i ++ )
{
if (s[2 * i] != s[2 * i + 1])
{
puts("No");
return 0;
}
}
for (int i = 0; i < n; i ++ )
cnt[s[i] - 'a'] ++;
for (int i = 0; i < 26; i ++ )
{
if ((cnt[i] != 0) && (cnt[i] != 2))
{
puts("No");
return 0;
}
}
puts("Yes");
return 0;
}
C - 11/22 Substring
题目
满足以下所有条件的字符串 称为 11/22 字符串:
- 是奇数。这里, 表示 的长度。
- 从 到 的字符都是
1。 - 第 个字符是
/。 - 第 个到第 个字符都是
2。
例如,
11/22、111/222 和 / 是 11/22 字符串,但 1122、1/222、11/222、22/11 和 /2/2/211 则不是。给定长度为 的字符串 由
1、2 和 / 组成,其中 包含至少一个 /。请找出长度为 11/22 的 的连续子串的最大长度。
思路
模拟。先枚举找到
/,再向两边枚举,判断此时的字串是不是 11/22 字符串。如果是,就更新答案。代码
CPP#include <bits/stdc++.h>
using namespace std;
int n, ans, sum;
char a[200010];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
cin >> a[i];
for (int i = 1; i <= n; i ++ )
{
if (a[i] == '/')
{
sum = 1;
for (int j = i - 1, k = i + 1; j >= 1 && k <= n; j --, k ++ )
{
if (a[j] == '1' && a[k] == '2')
sum += 2;
else
break;
}
ans = max(ans, sum);
}
}
cout << ans << '\n';
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...