Contest 152
2019-09-01 20:59:55
总体感受:最近几次参加contest发现自己的水平还是严重的不够,尤其是在处理一些异常情况的时候,遇到TLE,MLE如何有效的进行Debug是需要去锻炼的。
注意点:
1)TLE,首先可以通过加上特殊判断进行解决,这个需要在实际的问题中考虑好特殊的情况,过滤掉明显不符合的解;其次可以考虑是否可以使用位运算来进行状态压缩,同时降低时间复杂度。
2)1e9 + 7不要使用long / double去规避,目前有的方法有加法每次取mod,或者使用bigInteger。
3)时间把握不够,每次写到第三题就没什么时间了。
- 1177. Can Make Palindrome from Substring
问题描述:


问题求解:
解法一:没有考虑到k >= 13的时候直接返回True的特殊情况,导致TLE。加上特判,可以过。但是问题是这个解法的最差时间复杂度是O(mn)。
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
List<Boolean> res = new ArrayList<>();
char[] chs = s.toCharArray();
for (int[] q : queries) {
res.add(helper(chs, q[0], q[1], q[2]));
}
return res;
}
private boolean helper(char[] chs, int s, int e, int k) {
if (k >= 13) return true;
Set<Character> set = new HashSet<>();
for (int i = s; i <= e; i++) {
char c = chs[i];
if (!set.add(c)) set.remove(c);
}
return set.size() / 2 <= k;
}
解法二:比较好的解法是维护一个前缀和,记录前缀的字符出现的次数,之后在查询的时候就不需要再遍历s了,时间复杂度可以降到O(m)。
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
List<Boolean> ans = new ArrayList<>();
int[][] cnt = new int[s.length() + 1][26];
for (int i = 0; i < s.length(); ++i) {
cnt[i + 1] = cnt[i].clone(); // copy previous sum.
++cnt[i + 1][s.charAt(i) - 'a'];
}
for (int[] q : queries) {
int sum = 0;
for (int i = 0; i < 26; ++i) {
sum += (cnt[q[1] + 1][i] - cnt[q[0]][i]) % 2;
}
ans.add(sum / 2 <= q[2]);
}
return ans;
}
- 1178. Number of Valid Words for Each Puzzle
问题描述:


问题求解:
解法一:BF,TLE。
public List<Integer> findNumOfValidWords(String[] words, String[] puzzles) {
List<Integer> res = new ArrayList<>();
int n = words.length;
int m = puzzles.length;
int[][] freqw = new int[n][26];
int[][] freqq = new int[m][26];
for (int i = 0; i < n; i++) {
for (char c : words[i].toCharArray()) {
freqw[i][c - 'a']++;
}
}
for (int i = 0; i < m; i++) {
for (char c : puzzles[i].toCharArray()) {
freqq[i][c - 'a']++;
}
}
for (int i = 0; i < m; i++) {
res.add(helper(freqq[i], puzzles[i].charAt(0), freqw, n));
}
return res;
}
private int helper(int[] freq, char c, int[][] freqw, int n) {
int res = 0;
for (int i = 0; i < n; i++) {
if (freqw[i][c - 'a'] == 0) continue;
if (isvalid(freq, freqw[i])) res++;
}
return res;
}
private boolean isvalid(int[] freq, int[] freqw) {
for (int i = 0; i < 26; i++) {
if (freqw[i] != 0 && freq[i] == 0) return false;
}
return true;
}
解法二:
本题的考点是位运算,可以使用位运算进行状态的压缩,另外单纯知道位运算进行状态压缩还是会TLE。
需要考虑到puzzles的长度仅仅只有7,也就是说状态压缩之后其subset只有2 ^ 7 = 128种状态,如果直接遍历words的状压的map,会TLE,但是如果遍历puzzle的subset时间复杂度就会降低很多。
二进制求subset也是本题的核心考点。
public List<Integer> findNumOfValidWords(String[] words, String[] puzzles) {
List<Integer> res = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
for (String word : words) {
int mask = 0;
for (char c : word.toCharArray()) {
mask |= 1 << c - 'a';
}
map.put(mask, map.getOrDefault(mask, 0) + 1);
}
for (String puzzle : puzzles) {
int sum = 0;
int mask = 0;
int start = 1 << puzzle.charAt(0) - 'a';
for (char c : puzzle.toCharArray()) {
mask |= 1 << c - 'a';
}
for (int s = mask; s > 0; s = (s - 1) & mask) {
if (map.containsKey(s) && (s & start) == start) sum += map.get(s);
}
res.add(sum);
}
return res;
}
Contest 152的更多相关文章
- Leetcode Weekly Contest 152
退役老人现在连leetcode都不会做了 = = 今天早上做了leetcode第三题题目看错了,加上比赛中间还在调投稿的实验,一心二用直接gg 总结下教训就是 本渣现在做题连题目都看不清就开始做.开始 ...
- Mergeable Stack 直接list内置函数。(152 - The 18th Zhejiang University Programming Contest Sponsored by TuSimple)
题意:模拟栈,正常pop,push,多一个merge A B 形象地说就是就是将栈B堆到栈A上. 题解:直接用list 的pop_back,push_back,splice 模拟, 坑:用splice ...
- 152 - - G Traffic Light 搜索(The 18th Zhejiang University Programming Contest Sponsored by TuSimple )
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5738 题意 给你一个map 每个格子里有一个红绿灯,用0,1表示 ...
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...
- 2014 ACM-ICPC Beijing Invitational Programming Contest
点击打开链接 Happy Reversal Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld J ...
- 2015 Multi-University Training Contest 1 Assignment
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Benelux Algorithm Programming Contest 2014 Final(第二场)
B:Button Bashing You recently acquired a new microwave, and noticed that it provides a large number ...
- 「CometOJ」Contest #11
Link Aeon 显然字典序最大就是把最小的字母放在最后 Business [动态规划] 简单dp dp[i][j]dp[i][j]dp[i][j]表示到第iii天,当前有jjj块钱,最后返还的钱最 ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
随机推荐
- Daily Practice 2016-09-20
算法 回文(Palindrome)数字:判断一个数字是不是回文数字,不能使用另外的空间. 提示: 负数可以是回文数字吗? 如果转为字符串需要新分配空间 你也许想到了反转数字,但反转数字可能溢出,怎样处 ...
- GRE阅读
界面和托福差不多,就是反一反 GRE先读文章!因为出题顺序不一致.另外,不能跳读!!每一句都要读,即使不是观点. 考察能力: 1 三秒版本 边读边概括 解决前面的抗遗忘能力 2 句间关系 取同 取反 ...
- go微服务框架kratos学习笔记十(熔断器)
目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...
- Swift--struct与class的区别(汇编角度底层分析)
概述 相对Objective-C, Swift使用结构体Struct的比例大大增加了,其中Int, Bool,以及String,Array等底层全部使用Struct来定义!在Swift中结构体不仅可以 ...
- SpringBoot入门系列(三)资源文件属性配置
前面介绍了Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据.不清楚的朋友可以看看之前的文章:https://www.cnbl ...
- DIV的失去焦点(blur)实现
用防抖实现DIV鼠标移出消失 由于div标签本身不支持onblur事件,所以对于点击一个按钮弹出的div,我们想要当这个div失去焦点的时候,让它消失不能使用的onblur来实现. 但是可以利用 ...
- 编程史话第四期-饱受争议的前端之王JavaScript的血泪成长史
写在前面 这篇博文主要介绍javaScript的发展史,根据作者在B站发布的同名视频的文案整理修改而成,对视频感兴趣的博友可访问https://www.bilibili.com/video/av945 ...
- seo搜索优化教程13-SEO搜索引擎站点收录
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第13课 想要用户能够在搜索引擎中通过关键词搜索到您的页面信息,首先要做的是让搜索引擎收录您 ...
- Nginx之负载均衡配置(一)
前文我们聊了下nginx作为反向代理服务器,代理后端动态应用服务器的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12430543.html:今天我们来聊 ...
- MongoDB复制集概念架构浅析
一.复制集的作用 (1) 高可用 防止设备(服务器.网络)故障. 提供自动failover 功能. 技术来保证数 (2) 灾难恢复 当发生故障时,可以从其他节点恢复. (3) 功能隔离 用于分析.报表 ...