模拟赛#2 | 牛客普及周赛

题目链接: https://ac.nowcoder.com/acm/contest/59275#rank


A. 枚举不讲
B. 简单二分不讲
C. 暴力是O(n2)的, 用KMP可以直接做到O(n), 贴一下代码

/*
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, O(nlogn)

/*
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
实际得分:

posted @   IHOPEIDIEYOUNG  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示