2021寒假
文章平均质量分 53
呃呃...
这个作者很懒,什么都没留下…
展开
-
P3193 [HNOI2008]GT考试
题意:(题目来源:洛谷)解题思路:看数据规模这道题用数位dp就显然不行~~(然后我就看了题解~~设dp[i][j]代表长串匹配到第i位,短串匹配到第j位的答案设a[i][j]代表模式串的第$i位到第j位有多少种添加数的方案dp[i][j]=∑k=0m−1dp[i−1][k]∗a[i][j]dp[i][j]=\sum_{k=0}^{m-1}dp[i-1][k]*a[i][j]dp[i][j]=∑k=0m−1dp[i−1][k]∗a[i][j](借用大佬博客的内容)AC代码:#inc原创 2021-02-23 11:44:52 · 96 阅读 · 0 评论 -
2021-02-23
题目大意:解题思路:https://blog.csdn.net/The_OIer/article/details/102768137AC代码:#include <bits/stdc++.h>using namespace std;const int maxn = 5e5 + 10;string s;int nxt[maxn], dp[maxn], p[maxn];void getnxt() { int l = s.size(), i = 0, j = -1;转载 2021-02-23 11:27:52 · 81 阅读 · 0 评论 -
P2375 [NOI2014] 动物园(KMP)
题意:(题目来源:洛谷)解题思路:因为不重复的不好求,所以换个思路,包含重复的情况怎么求显然直接在求next过程就可以递推求出包含重复的情况个数sum[i]而题目答案我们只需要对每个长度,一直求next直到不重合,即为num[i]但这样无疑会超时,会被:aaaaaaaa…aaaaa这样的数据卡掉然后观察可发现:对于已经求出i的答案位置j,j <= i/2,所以我们只要判断j+1是否等于i+1即可如果等于,那么答案就为sum[j+1]否则求next即可AC代码:#inclu原创 2021-02-23 11:05:40 · 117 阅读 · 0 评论 -
P4824 [USACO15FEB]Censoring S(kmp)
题意:(题目来源:洛谷)解题思路:在栈中模拟kmp过程即可AC代码:#include <bits/stdc++.h>using namespace std;const int maxn = 1e6 + 10;string s1, s2;int nxt[maxn];void getnxt() { int l2 = s2.size(), i = 0, j = -1; nxt[i] = j; while (i < l2) { if原创 2021-02-23 10:51:23 · 112 阅读 · 0 评论 -
P3435 [POI2006]OKR-Periods of Words(kmp)
题意:(题目来源:洛谷)解题思路:前面说了最小周期是n-nxt[n]那么只要对nxt[n]一直求nxt即可,知道nxt等于0AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6 + 10;string s;int nxt[maxn];void getnxt(string s, int *nxt) { int l = s.size()原创 2021-02-23 10:46:53 · 65 阅读 · 0 评论 -
P4391 [BOI2009]Radio Transmission 无线传输(KMP)
题意:(题目来源:洛谷)解题思路:直接说结论:n−nxt[n]n-nxt[n]n−nxt[n]接下来给出证明:当nxt[n]前后不重合:接下来证明有没有比n-nxt[n]短的长度假设存在:那么灰色的前后缀是相等的,所以其一定比nxt[n]大,造成矛盾当nxt[n]前后重合:同理可证AC代码:#include <bits/stdc++.h>using namespace std;const int maxn = 1e6 + 10;string s原创 2021-02-23 10:28:33 · 161 阅读 · 0 评论 -
CF1200E Compress Words(hash/kmp)
题意:(翻译来源:洛谷)解题思路:Hash做法最常用的hash是进制hash所以我们只要依次判断每个添加进来的字符串的每个长度,替换掉答案字符串后缀的同样长度,hash值是否相等即可hans1[lans] == (h1 + hans1[lans - j] * ex1[j] % mod1) % mod1//这段是替换答案后j个长度的字符串(可以将其与进制向左移联系在一起)AC代码:#include <bits/stdc++.h>using namespace std;原创 2021-02-23 10:02:23 · 113 阅读 · 0 评论 -
Bzoj3098. Hash Killer II(生日冲突原理)
题目链接:Bzoj3098解题思路:生日冲突:n个数,随机选n\sqrt nn个数,才发生冲突所以直接对模数,随机输出一个其根号长度的答案即可AC代码:#include <bits/stdc++.h>using namespace std;int main() { srand(time(0)); cout << 100000 << " " << 20 << endl; for (int i = 1; i &原创 2021-02-23 09:56:37 · 253 阅读 · 0 评论 -
P3370 【模板】字符串哈希
题意:(来源:洛谷)解题思路:AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e4 + 10;const int maxm = 2e3 + 10;ll M1 = 10001227, M2 = 10001603;ll b1 = 2, b2 = 3;ll ex1[maxm], ex2[maxm];void match_pre(int n) {原创 2021-02-23 09:42:33 · 70 阅读 · 0 评论 -
P2534 [AHOI2012]铁盘整理(IDA*)
题目大意:解题思路:其实只要注意到,如果数字是连续的,那么第i层与第i+1层的高度差为1,而每次只能翻转1~k层,相当于只能改变第k层与第k+1层的差,即只能改变一个相邻差IDA*步骤:离散化,然后再考虑估价函数,估价函数显然就是有多少个相邻差不为1的即可,这就是最少翻的次数再将其与剩下可递归层数比较判断是否可行剩下的就是套就完事了AC代码:#include <bits/stdc++.h>using namespace std;const int maxn = 1e2原创 2021-02-05 11:09:42 · 168 阅读 · 0 评论 -
P4929 【模板】舞蹈链(DLX)
没学过舞蹈链的可看这篇博客:跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题(大佬讲的是真好呀)此篇博客仅提供一段封装好的代码:#include<iostream>#include<cstdio>using namespace std;const int maxn = 5500;struct DLX { int ans[maxn]; //储存答案 int n, m, x; int cnt, lin[maxn], sz[maxn];原创 2021-02-05 11:09:55 · 73 阅读 · 0 评论 -
P2324 [SCOI2005]骑士精神(IDA*)
题目大意:(来源:洛谷)解题思路:其实就相当于八数码难题把,估价函数都一样,感觉用A星也可以做,为了练习,还是用了IDA*其实就多了判断当前剩余层次是否够用就行了if (maxd + 1 - d < h(cur)) return false;AC代码:#include<bits/stdc++.h>using namespace std;char goal[10][10] = {{"11111"}, {"01111"}, {"00*11"}, {"00001"},原创 2021-02-05 11:09:31 · 122 阅读 · 0 评论 -
UVA12558 埃及分数 Egyptian Fractions (HARD version)(IDA*)
题目大意:解题思路:因为是第一次写IDA的博客,所以用oiwiki来简单介绍下IDA即相当于dfs的改进,既有迭代加深又有估价函数对于这道题我们先来想一个简单版,如果没有要求哪些分母不能用怎么办呢?首先是不太可能用bfs来做,因为正整数有无数多个,所以方向是无数多个,所以这道题我们利用dfs来做而dfs不限制深度是不行的,所以我们将其迭代加深来搜索又因为不能有相同的分母,所以我们将分母从小到大来搜索那么对于ab\frac{a}{b}ba的最小分母就是满足1c≤ab\frac 1原创 2021-02-01 13:49:03 · 108 阅读 · 0 评论 -
P4467 [SCOI2007]k短路(A*算法)
题目大意:解题思路:这道题A星只能过到90分,出题人故意卡了这个算法,但这也算是一道经典的A星题A星做法:当第k次到达终点时的路径,即为答案首先考虑h(x)估价函数应为什么,对于要找第k短的路径我们没什么头绪,可以先考虑找最短路径的h(x)应为什么,那么找最短路径的h(x)我们就设置其为x到终点的最短距离在这个基础上我们要找第k短的,f,g,h仅仅是不够的,我们可以看看题目在说了什么?长度相同按字典序排序那么这时候我们只要再把路径考虑进去,即可得到答案(因为h(x)符合三角不等式,原创 2021-02-01 13:27:21 · 208 阅读 · 0 评论 -
P1379 八数码难题(A*)
题目大意:(来源:洛谷)解题思路:因为是第一次写A*的博客,所以用oiwiki的介绍来简单说明一下该算法h*(x)为实际所需的代价,h(x)为预先算好的最小可能需要代价,g(x)是随着bfs计算出来的而三角形不等式,则是松弛操作,即h(step)<=h(step+1)+1h(step)<=h(step+1)+1h(step)<=h(step+1)+1那么这道题我们尝试用A*来做(其实记忆化搜索也可以)首先考虑本题估价函数h(x),h(x)为当前状态与目标状态不同的个原创 2021-02-01 10:36:23 · 156 阅读 · 0 评论 -
P3067 [USACO12OPEN]Balanced Cow Subsets G(折半搜索)
题目大意:给n(≤20\le20≤20)个数,从中任意选出一些数,使这些数能分成和相等的两组。求有多少种选数的方案。(来源:洛谷)解题思路:先思考下,每种数有多少种取法,可以看出(一开始我就没看出 )有3种取法:不取,放入左集合与放入右集合,直接暴力的话就是O(320)O(3^{20})O(320),所以我们试着采取折半搜索在采取折半搜索之前,我们先明确放入左右集合的区别,因为要求两个集合相等,则它们相差为0,若放入左集合相当于加上一个数,则放入右集合相当于减去一个数若折半搜索可行相遇的状原创 2021-02-01 10:11:23 · 313 阅读 · 0 评论 -
P4799 [CEOI2015 Day2]世界冰球锦标赛(折半搜索)
题目大意:解题思路:如果直接暴力(你的钱太多不允许你用背包),时间复杂度为O(240)O(2^{40})O(240)次方,但如果折半搜索可行的话,时间复杂度就为O(40∗220)O(40*2^{20})O(40∗220),则是可接受的如果折半搜索可行的话:那么初末状态无非就是0与m,搜索的方法也显而易见就是选与不选嘛那么相遇的情况如何讨论呢?因为你没必要把钱全部用完所以我们不能只是简单的第二次搜索找到存储过的状态就算一种情况,应该还要考虑前用不完的情况所以我们分别利用两个数组,存储两次搜原创 2021-02-01 09:49:37 · 86 阅读 · 0 评论 -
[Usaco2009 Nov]lights 燈(折半搜索)
题目大意:(来源:darkbzoj)解题思路:因为是第一次写折半搜索的博客,所以先明确什么是折半搜索从状态图上起点和终点同时(但在程序上你无法并行计算,所以会有个先后顺序,先进行的搜索对于状态进行存储,后进行的搜索遇到已经存储过的状态则认为着相遇)开始进行宽度/深度优先搜索(分别都只利用一半的状态),如果发现相遇了,那么可以认为是获得了可行解。对于这道题,首先利用位运算来存储每盏灯相关联的灯 for (int i = 0; i < n; i++) a[i] = (1ll &l原创 2021-02-01 09:29:26 · 108 阅读 · 0 评论 -
P1074 [NOIP2009 提高组] 靶形数独(搜索剪枝)
题目大意:解题思路:这题不难,但是学到了一个特别实用的搜索小技巧:先从状态少的开始搜索因为搜索树上虽然节点个数相同剪枝会剪掉更多的节点。感性理解一下,如果在某个地方存在剪枝,把情况较多的节点放在它后面枚举显然比放在前面快AC代码:#include <bits/stdc++.h>using namespace std;int cnt, ans = -1;int a[10][10], row[10][10], column[10][10], pal[10][10], z原创 2021-02-01 09:00:17 · 223 阅读 · 0 评论 -
P1120 小木棍 [数据加强版](搜索剪枝)
题目大意:(来源:洛谷)解题思路:暴力枚举总和的约束,进行搜索将小木棍从大到小排序,因为这样枚举,会使后面有更灵活的组合引用**大佬博客**的两句话:当前长棍剩余的未拼长度等于当前木棍的长度时,这根木棍在最优情况下显然是拼到这(如果用更多短木根拼完剩下的这段,把这根木棍留到后面显然不如把更多总长相等的短木棍扔到后面)。如果在最优情况下继续拼下去失败了,那肯定是之前的木棍用错了,回溯改即可。当前长棍剩余的未拼长度等于原始长度时,说明这根原来的长棍还一点没拼,现在正在放入一根木棍。很明显,这根原创 2021-02-01 08:53:11 · 119 阅读 · 1 评论 -
P3953 [NOIP2017 提高组] 逛公园(最短路(Dijksra)+拓扑排序+DP)
题目大意:(来源:洛谷)解题思路:首先我们先明确为什么会出现无穷多条路径这个答案显而易见,就是有0环那么怎样的0环会使得答案出现无穷多条路径呢对于k=1k=1k=1的情况,作如下图:因为最短路为3,k=1k=1k=1,所以可行的路径大小在[3,4][3,4][3,4],那么处于下方的0环就不在我们考虑的范围内,而上方的0环则会使我们的路径有无限多条所以当且仅当0边处在可走区间的范围内时,这些0边构成的0环才会对结果产生影响,同时我们把这些0边又叫做可行0边那么如何把得到所有原创 2021-02-01 08:26:22 · 415 阅读 · 2 评论 -
P1514 [NOIP2010 提高组] 引水入城(记忆化搜索)
题目大意:(来源:洛谷P1514)解题思路:本题分为两个问题:是否能够使所有干旱地区都可能建有水利设施在都可能有水利设施的情况下,建设最少的蓄水厂首先证明该题的一个定理,如果存在解,那么每个蓄水厂所作用干旱区的范围一定是连续的(有解是大前提)假设在有解的情况下,存在不连续的情况(蓝色方格和黄色方格任意一方都无法抵答)则最底下黄色中间那块的蓝色方块,无论如何流向,它们都会有如下的交点所以证毕那么接下来,我们只需要算出顶部每个方格的最长覆盖区间(覆盖最底下的区间)原创 2021-02-01 07:06:57 · 309 阅读 · 0 评论