模拟赛#2 | 牛客普及周赛
题目链接: https://ac.nowcoder.com/acm/contest/59275#rank
A. 枚举不讲
B. 简单二分不讲
C. 暴力是
/*
Author: SJ
*/
#include<bits/stdc++.h>
const int N = 2e6 + 10;
using ll = long long;
using ull = unsigned long long;
std::string s, a, b;
int pi[N];
bool mark[N];
void kmp(std::string txt, std::string pat) {
std::string tmp1 = pat + '%' + txt;
for (int i = 1; i < tmp1.size(); i++) {
int j = pi[i - 1];
while (j > 0 && tmp1[i] != tmp1[j]) j = pi[j - 1];
if (tmp1[i] == tmp1[j]) j++;
pi[i] = j;
if (j == pat.size()) {
mark[i - 2 * j] = 1;
}
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> s >> a >> b;
kmp(s, a);
for (int i = 0; i < s.size(); i++) {
if (mark[i]) {
std::cout << b;
i = i + a.size() - 1;
} else std::cout << s[i];
}
return 0;
}
这题用STL暴力有90分也是醉了
D. 最长不出现重复元素子序列
用push的双指针写的很丑, 以后这种问题要用pull来写感觉不太容易错, 贴一下重新写的代码, 双指针加map,
/*
Author: SJ
*/
#include<bits/stdc++.h>
const int N = 1e6 + 10;
using ll = long long;
using ull = unsigned long long;
int n, a[N], ans;
std::map<int, int> mp;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n;
for (int i = 1; i <= n; i++) std::cin >> a[i];
for (int i = 1, j = 1; j <= n; j++) {
mp[a[j]]++;
while (i < j && mp[a[j]] >= 2) {
mp[a[i]]--;
i++;
}
ans = std::max(ans, j - i + 1);
}
std::cout << ans;
return 0;
}
总结:
1)双指针和dp这些东西, 想清楚是要push还是要pull可能会减少判边界, 代码难度.
2)对于思考 -> 判断使用什么算法 -> brain coding -> 动手写(三段式) -> 检查这个pattern, 真正模拟赛的时候前三者更要注意
期望得分: 400/400
实际得分:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!