VP AtCoder Beginner Contest 381
A - 11/22 String
题意:定义
模拟即可。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
if (n % 2 == 0 || s.substr(0, n / 2) != std::string(n / 2, '1') || s.substr(n / 2 + 1) != std::string(n / 2, '2') || s[n / 2] != '/') {
std::cout << "No\n";
} else {
std::cout << "Yes\n";
}
}
B - 1122 String
题意:定义
一样模拟。
点击查看代码
void solve() {
std::string s;
std::cin >> s;
int n = s.size();
if (n & 1) {
std::cout << "No\n";
return;
}
std::vector<int> cnt(26);
for (int i = 0; i < n; i += 2) {
if (s[i] != s[i + 1]) {
std::cout << "No\n";
return;
}
if (cnt[s[i] - 'a']) {
std::cout << "No\n";
return;
}
cnt[s[i] - 'a'] = 1;
}
std::cout << "Yes\n";
}
C - 11/22 Substring
题意:和
在每个'/'处两边扩展记录最长长度即可。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
int ans = 0;
for (int i = 0; i < n; ++ i) {
if (s[i] == '/') {
int k = 1;
while (i - k >= 0 && i + k < n && s[i - k] == '1' && s[i + k] == '2') {
++ k;
}
ans = std::max(ans, (k - 1) * 2 + 1);
}
}
std::cout << ans << "\n";
}
D - 1122 Substring
题意:和
记录每个数出现的次数,分奇数起点和偶数起点分别双指针模拟即可。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::vector<int> st(n + 1);
int ans = 0;
for (int i = 0, j = 0; i + 1 < n;) {
j = std::max(i, j);
while (j + 1 < n && a[j] == a[j + 1] && st[a[j]] == 0) {
st[a[j]] = 1;
j += 2;
}
ans = std::max(ans, j - i);
st[a[i]] = 0;
i += 2;
}
for (int i = 1, j = 1; i + 1 < n;) {
j = std::max(i, j);
while (j + 1 < n && a[j] == a[j + 1] && st[a[j]] == 0) {
st[a[j]] = 1;
j += 2;
}
ans = std::max(ans, j - i);
st[a[i]] = 0;
i += 2;
}
std::cout << ans << "\n";
}
E - 11/22 Subsequence
题意:和
把所有'/'的位置存下来,然后记录
点击查看代码
void solve() {
int n, q;
std::cin >> n >> q;
std::string s;
std::cin >> s;
std::vector<int> sum1(n + 1), sum2(n + 1);
std::vector<int> a;
for (int i = 0; i < n; ++ i) {
sum1[i + 1] = sum1[i] + (s[i] == '1');
sum2[i + 1] = sum2[i] + (s[i] == '2');
if (s[i] == '/') {
a.push_back(i + 1);
}
}
while (q -- ) {
int l, r;
std::cin >> l >> r;
int L = std::lower_bound(a.begin(), a.end(), l) - a.begin();
int R = std::upper_bound(a.begin(), a.end(), r) - a.begin() - 1;
if (L > R) {
std::cout << 0 << "\n";
continue;
}
int ans = 0;
while (L <= R) {
int mid = L + R >> 1;
int one = sum1[a[mid]] - sum1[l - 1], two = sum2[r] - sum2[a[mid]];
ans = std::max(ans, std::min(one, two));
if (one >= two) {
R = mid - 1;
} else {
L = mid + 1;
}
}
std::cout << ans * 2 + 1 << "\n";
}
}
F - 1122 Subsequence
题意:跟
注意值域只有
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
std::vector suf(n + 1, std::array<int, 20>{});
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
-- a[i];
}
for (int i = n - 1; i >= 0; -- i) {
suf[i] = suf[i + 1];
suf[i][a[i]] = i + 1;
}
std::vector<int> f(1 << 20, n + 1);
f[0] = 0;
for (int i = 0; i < 1 << 20; ++ i) {
if (f[i] > n) {
continue;
}
for (int j = 0; j < 20; ++ j) {
if ((~i >> j & 1) && suf[f[i]][j] != 0 && suf[suf[f[i]][j]][j] != 0) {
f[i | (1 << j)] = std::min(f[i | (1 << j)], suf[suf[f[i]][j]][j]);
}
}
}
int ans = 0;
for (int i = 0; i < 1 << 20; ++ i) {
if (f[i] <= n) {
ans = std::max(ans, __builtin_popcount(i));
}
}
std::cout << ans * 2 << "\n";
}
分类:
atcoder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具