题解
Ogmx
学海无涯~
展开
-
CF.1045I.Palindrome Pairs-字符串+hash
题意:给出若干个字符串,任意两个字符串可任意拼接组合,任意拼接就相当于把两个字符串的字母都取出来,然后再重新组成新字符串,求有多少对字符串拼接后能构成回文串思路:对于一个回文串,至多只有一个字母出现奇数次,其余字母都出现偶数次,通过这性质,我们把一个字符串哈希成26位的01串,01串的第i位表示字母表中第i个字母出现次数的奇偶。遍历所有字符串,统计与该字符串hash值至多只有一位不同的h...原创 2018-11-06 16:05:36 · 458 阅读 · 0 评论 -
2018 BACS High School Programing Contest J.Non Super Boring Substring-manacher+双指针
题意:给出一个字符串,求其子串中不包含长度大于等于k的回文串的子串个数思路:对于单串回文问题,考虑使用manacher算法进行预处理,即可处理出以每个位置为中点的最长回文半径使用双指针技术,结合回文半径的信息,处理出以每个位置为起点,在不构成大于等于k的回文串前提下,向后能到达的最远位置对于任何一个大于k的回文串,我们都可以将其看做长度为k或k+1的回文串,因为只要包含长度大于等于k...原创 2018-09-27 11:54:00 · 290 阅读 · 0 评论 -
2018HDU多校5-Problem B. Beautiful Now (hdu 6351)-搜索+剪枝
题意:给出一个数,最长有9位,每次可以交换其中两个位置的数,也可以不动,求k次操作后能得到的最大值与最小值思路:首先考虑贪心做法,取最大值时每次将最大的数尽可能放在前面,取最小值时每次将最小的数尽可能放在前面,但是我们会发现对于存在很多相同数的情况,会出现错误例如: k=2时的970979,贪心的求出最大值是999077,但实际上可以达到的最大值是999770所以我们只能采用搜索的方式...原创 2018-09-27 00:06:15 · 233 阅读 · 0 评论 -
JSK 习题:密码安全性进阶版(hdu 3518)-后缀数组-求至少出现两次的不重叠子串个数
题意:求至少出现两次的不重叠子串个数思路:首先建立后缀数组和相关数据,然后枚举长度,从1~(len+1)/2,因为长度大于(len+1)/2的子串最多只能不重复出现一次对于枚举的每个长度,按顺序遍历各个height,对于连续的一段height[ij]>l,记录这一段中sa[ij]的最小值与最大值若最大值与最小值之差大于等于l,则说明存在一个长度为l的子串,出现了j-i次,若j-i...原创 2018-09-20 22:55:02 · 227 阅读 · 0 评论 -
cf 154-C. Double Profiles-图+hash
题意:对于一对点(a,b),若除a、b之外的每个点k,要么k与a、b都相连,要么k与a、b都不相连,a与b直接相不相连都可 求有多少对(a,b)满足这样的条件思路:只有a和b的连接情况完全相同时,这样的(a,b)才成立,分为a和b相连和a和b不相连两种情况考虑 若a和b相连,对于相连的a和b,每个点最后的值要加上它本身 若a和b不相连,直接判断是否相等即可 对1~n的每个点...原创 2018-09-13 21:22:49 · 216 阅读 · 0 评论 -
JSK 习题:情报加密(hdu 2457,poj 3691)-AC自动机+dp
题意:给出n个匹配串,一个文本串,问最少修改多少次,可以使文本串中不包含任意一个匹配串,修改也只能在ABCD四个字母中选择思路:先对n个匹配串建立AC自动机,构建fail指针时,有一步特殊处理,即若fail[x]被标记为成功匹配,则x也要标记为成功匹配,就是说以x为结尾的串中包含了能匹配成功的串,则x也要被标记 dp[i][j]表示对于文本串前i个字符组成的串,当前在AC自动机的...原创 2018-09-13 19:27:37 · 357 阅读 · 0 评论 -
ACM-ICPC 2018 青岛赛区网络预赛-J.Press the Button(zoj 4056)-思维+vector
题意:有一个按钮、一个灯、一个计时器和一个计数器,每按一次按钮,计时器被置为v+0.5,若当前灯是灭的,按一次后变亮,若当前灯是亮的,按一次后计数器+1,若当前时间nt%a0,则按b次按钮,若nt%c0,则按d次按钮,问最后时间为t时,计数器的值思路:…代码:#include <bits/stdc++.h>using namespace std;typedef long...原创 2018-09-18 11:30:50 · 340 阅读 · 0 评论 -
ACM-ICPC 2018 徐州赛区网络预赛-B.BE, GE or NE-对抗博弈dp
题意:有两个神仙玩游戏,A想让最后得分大于等于K,B想让最后得分小于等于L,每次有1~3种选择,可使当前分+x,当前分-x,当前分*-1 三种选择至少存在一种,注意游戏中的分数有上下界限制,-100~100 若超过则按边界算,因为A和B都是神仙,所以他们每次都做最优选择,问最后游戏的结果思路:对抗博弈中的常用算法MiniMax,此算法的思路很简单,可自行百度理解 在本题中,...原创 2018-09-10 19:19:22 · 261 阅读 · 0 评论 -
ACM-ICPC 2018 沈阳赛区网络预赛-Fantastic Graph-有源汇上下界可行流
题意:给出一个二分图,初始各个点度数均为0,每选择一条边,则相应的两点的度数+1,并给出上下界L~R,求能否构成一个网络,使每个点的度数都在L~R之间思路:有源汇上下界可行流,先添加一个源点连接所有左侧点,添加一个汇点,使所有右侧点连向汇点,根据上下界网络流做法,还需添加一个附加源点和附加汇点,表示必要弧 具体方法讲解见https://blog.csdn.net/u01100...原创 2018-09-10 18:21:15 · 186 阅读 · 0 评论 -
ACM-ICPC 2018 焦作赛区网络预赛-H.String and Times-后缀数组/后缀自动机-出现次数大于l小于r的子串个数
题意:即求出现次数大于l小于r的可重叠子串个数思路:类比于求出现次数等于k的可重叠子串个数,即求出次数大于等于k次的,再求出出现次数大于等于k+1次的,然后用出现大于等于k次的减去出现大于等于k+1次的,再容斥处理一下,即是正好出现k次的子串个数只需要修改一下容斥部分,就可以很容易的将上述问题改为本题对于本题,我们要求的就是出现大于等于l次的和出现大于r次的,用出现大于等于k次的减去出...原创 2018-09-17 20:10:29 · 360 阅读 · 1 评论 -
ACM-ICPC 2018 沈阳赛区网络预赛-Made In Heaven-K短路
题意:求第k短路,并判断第k短路的花费是否大于T思路:K短路模板题,spfa+A*,注意A*的写法,否则容易MLE或TLE,(别问我怎么知道的…..)代码:#include <iostream>#include <stdio.h>#include <cstring>#include <queue>using原创 2018-09-10 13:49:33 · 272 阅读 · 0 评论 -
JSK习题:蒜头君的城堡之旅-dp
题意:在一个二维矩阵上,给出一个起点和终点,矩阵上每个点的值代表价值,求从起点走到终点,再从终点返回起点,能取得的最大价值,且每个点只能走一次思路:对于来回路径上取值问题,很容易误以为先算从起点到终点能取得的最大价值,删去走过点后,再算一遍从终点到起点的最大价值 但显然这样只能保证去的时候得到了最大价值,而不能保证全局是最大的,所以不能这么做 将来回路径考虑成同时从起点出发到终...原创 2018-09-10 13:37:36 · 274 阅读 · 0 评论 -
cf-543-B.Destroying Roads-最短路+暴力
题意:有n个点,m条边,每条边的长度为1,给出s1,t1,l1表示s1到t1点路径长度不能超过l1,同理对于s2,t2,l2 现要求满足条件下,最多能删多少条边思路:删去最多的边,就是要用最少的边,所有s1->t1和s2->t2要在满足各自要求的前提下,尽可能多的共用一些边 由于n<=3000,可以用spfa在O(n^2)的时间内预处理出任意两点间的最...原创 2018-09-06 20:11:52 · 247 阅读 · 0 评论 -
JSK 习题:蒜头君传纸条进阶版(hdu 5008)-后缀数组,求第k大子串的左右端点
题意:给出一个字符串,求其第k大子串出现的位置,即其左右端点下标思路:首先构建后缀数组,因为后缀数组会对每个后缀排序,就相当于对所有子串进行了排序,因为子串就是后缀的前缀对于第i个后缀,其含有不同的子串个数为n-sa[i]-height[i]我们定义sum[i]=sum[i-1]+n-sa[i]-height[i],求出sum[1n],即求出第1n个后缀所含有不同子串个数的前缀和如...原创 2018-09-27 23:29:13 · 580 阅读 · 0 评论 -
HDU 3068-最长回文-回文自动机
题意:给出一个字符串,求其最长回文子串的长度思路:回文自动机模板题,建立完回文自动机后,len数组中所存的就是各个回文子串的长度,遍历一边取最大值即可注意遍历时要从2~p-1其他做法:使用manacher算法同样可以很简单的求解,在此不多做介绍代码:#include <bits/stdc++.h>using namespace std;const int MAX...原创 2018-09-28 18:55:14 · 274 阅读 · 0 评论 -
JSK 习题:签名篮球-巴什博弈
思路:有题意可知是巴什博弈,故直接用结论即可代码:#include <iostream>using namespace std;int main(){ int n,m; cin>>n>>m; if(n%(m+1)==0) cout<<"none"<<endl; else ...原创 2018-10-16 13:11:46 · 204 阅读 · 0 评论 -
JSK 习题:图类游戏-SG函数-dfs法
思路:对于图上的sg函数,常用dfs或深度优先搜索代码:#include <iostream>#include <math.h>#include <vector>#include <string.h>using namespace std;const int N=10000;vector<int>e[N];int...原创 2018-10-16 13:10:32 · 355 阅读 · 0 评论 -
JSK 习题:新尼姆游戏-SG函数-打表法
思路:只能取指定个数时,使用打表法,注意细节即可代码:#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int N=10005;int f[N],SG[N],S[N];void getSG(int n,int m) ...原创 2018-10-16 13:09:57 · 316 阅读 · 0 评论 -
JSK 习题:蒜头君的新游戏(hdu 1729)-SG函数
思路:设s为容量,c为当前数量,子游戏即仅对于一个箱子分析,若c+cc>=s,则必胜,因为可直接填满箱子。引入新变量t,且t+tt==s-1,此时t+tt为最接近s且小于s的数,将t与c对比进行分析c>t:必胜,可作图计算sg值,SG(s,s)=0,SG(s,s-1)=1,SG(s,s-2)=2… 故SG(s,s-c)=s-c,即此时sg值为s-c。c=t:必败,因t+tt...原创 2018-10-16 13:09:13 · 261 阅读 · 0 评论 -
BAPC 2010(Gym-101078J)J.Wrong Answer-二分图最大独立集
题意:在一个网格中玩填字游戏,因为有很多种填法,所以某个位置可能发生冲突,我们可以不填一些单词来避免冲突,求在没有冲突的情况下,最多能填多少个单词思路:首先对每个填入单词编号,由于填入单词分为横向和纵向的,而冲突只会发生在横向与纵向两个单词中,所以这构成了一个二分图,横向单词为一组,纵向单词为一组,若两单词发生冲突,则在两个单词间建立一条边求没有冲突的最多填词数,就等同于二分图的最大独...原创 2018-10-18 18:19:32 · 248 阅读 · 0 评论 -
JSK 习题:找出所有谎言(poj 1182)-并查集+偏移向量
思路:利用带权并查集,用偏移向量表示三种关系,以此计算利用向量表示关系,常设关系如,x对于y(x->y)的关系:x等于y 为0x吃y 为1x被吃y 为2由此可推出各种关系fa[x]对于x的关系:3-r[x]x对于fa[fa[x]]的关系:r[x]=(r[x]+r[fa[x]])%3y对于x的关系:(3-r[x]+r[y])%3y对于fx的关系:(d-1+r...原创 2018-09-28 23:01:19 · 406 阅读 · 0 评论 -
紫书5-UVA-136-丑数-优先队列,set
题意:定义丑数是只能被2,3,5整除的数,求第1500个丑数思路:利用优先队列,每次取出最小的数,并分别乘上2,3,5,并用set判断是否已经存在代码:#include &lt;iostream&gt;#include &lt;queue&gt;#include &lt;set&gt;using namespace std;typedef long long LL;原创 2018-09-28 22:56:40 · 218 阅读 · 0 评论 -
紫书5-UVA-156-反片语-map
题意:输出所有经过字母重组后仍不与其他词相同的词(不区分大小写),且按字典序排序(按原始数据输出)思路:先将每个词进行标准化,即都转换为小写后再进行排序,此时即可统计出字母重组后相同词的个数,并用map将标准化之后的词与出现次数映射再用一个vector储存所有标准化后只出现一次的词,排序后输出即为答案代码:#include <iostream>#include <...原创 2018-09-28 22:55:35 · 204 阅读 · 0 评论 -
紫书5-UVA-12096-集合栈计算机-stack,map技巧
题意:定义了5种操作,模拟相应操作即可思路:本题集合中存放的还是集合,故需要特殊方法,将每个集合映射到一个int编号,此题比较复杂,要仔细思考,详见代码注意此题这种特殊处理方法,思路很重要代码:#include <iostream>#include <stack>#include <map>#include <set>#inc...原创 2018-09-28 22:54:33 · 230 阅读 · 0 评论 -
紫书5-UVA-1592-数据库-map技巧
题意:给出一个表格,问表格中是否有某两行和某两列相等,即(r1,c1)=(r2,c1),(r1,c2)=(r2,c2),并输出位置思路:若用四重循环枚举各行格列一定会超时,所以只枚举每两行,再从上到下枚举这两行的所有列,将每次的值用pair维护,再将整个pair存入map,映射到相应列数,若map中存在相同pair,即证明当前两行中有答案,且两列数分别为map[pair],和当前列数k...原创 2018-09-28 22:52:28 · 189 阅读 · 0 评论 -
BZOJ 2565-最长双回文串-回文自动机
题意:给出一字符串,求其最长双回文子串长度,双回文串就是一个回文串能从某一点分成两段,且两段都是回文串思路:构建回文自动机时,每加入一个字符,就能知道以当前字符为右端点能构成的最长回文串长度正反构建两次回文自动机,就能处理出最长的双回文子串,具体看代码代码:#include <bits/stdc++.h>using namespace std;const int M...原创 2018-09-28 20:21:25 · 223 阅读 · 0 评论 -
HDU 3948-The Number of Palindromes-回文自动机
题意:给出一个字符串,求其不相同回文子串的个数思路:回文自动机模板题,因为回文自动机中每个新建的结点就表示一个回文子串,各个结点都不相同所以不同回文子串个数就是回文自动机中新增结点个数,直接输出即可代码:#include <bits/stdc++.h>using namespace std;const int MAXN = 100005 ;const int N ...原创 2018-09-28 19:39:37 · 626 阅读 · 0 评论 -
JSK 习题:蒜头君传纸条-后缀数组-至少出现k次的最长子串
题意:求至少出现k次的最长可重叠子串长度思路:后缀数组+二分枚举子串长度 设当前二分枚举到长度nk,统计height&gt;=nk的个数,表示长度大于等于nk的子串出现次数,若次数大于等于k,即找到答案代码:#include&lt;bits/stdc++.h&gt;using namespace std;const int MAXN = 200010;int s[...原创 2018-09-15 22:39:06 · 238 阅读 · 0 评论 -
JSK 习题:密码安全度-后缀数组-最长不重叠重复子串
题意:求最长不重叠重复子串长度思路:由于题目中要求的是相邻位置做差之后的最长不重叠重复子串,所以在读入时就将字符串处理成差分之后的形式 最长不重叠重复子串:不重叠表示选择的两个子串之间没有共用的字符,重复表示选择的两个子串必须完全相同 此题等价于求是否存在长度等于k的重复子串 使用后缀数组,二分枚举子串长度,height[i]存储的即是重复子串长度,height中最大值就是最...原创 2018-09-15 22:26:45 · 254 阅读 · 0 评论 -
2018HDU多校1-1004-Distinct Values(hdu6299)-区间,set
题意:构造一个字典序最小的数列,给出m个限定条件,对于每个限定条件,l:r,表示该数列中a[l:r]中各个数不相同思路:先将限定条件按最左最长排序,分三种情况讨论 1.若某区间完全被其他区间包含则略过 2.若两区间有重合部分,则重合部分不变,后部分从小到大填入可用数 3.若两区间没有重合部分,则两区间之间不...原创 2018-08-29 20:44:05 · 203 阅读 · 0 评论 -
2018HDU多校1-1003-Triangle Partition(hdu 6298)-简单图论
题意:给出一个无向图,每个边有一个标号,在标号相同的边上走不增加花费,每走到标号不同的边上时,花费+1,求从1~n的最小花费思路:与最短路问题极为相似,考虑对最短路算法进行修改 在spfa算法的基础上,遍历每个点,使用set记录由哪条边到达该点,若花费相同时,优先选由相同标号边到达的点,不同时按照正常spfa选择花费小的点,这样既可得到答案 其他方法...原创 2018-08-29 20:42:23 · 220 阅读 · 0 评论 -
HDU-6214-Smallest Minimum Cut-最小割边数
题意:求最小割的边数思路:由最大流最小割定理,该题等同于最大流,求最小割边数,对边权乘个比边大点的数比如300,再加1 ,最后,最大流对300取余就是边数啦 addedge(u,v,e.c*BIG+1) ans=maxf()%BIG代码:#include &lt;iostream&gt;#include &lt;string.h...原创 2018-09-02 20:57:28 · 173 阅读 · 0 评论 -
JSK-习题:受欢迎的蒜头-Tarjan强连通分量+缩点 (POJ2186)
思路:在有向无环图中,若任意点都能到达点A,那么有且仅有A点的出度为0,而题中可能包含环,通过缩环,构成新的有向无环图,若a欢迎b,则将a连向b,通过Taijan缩环模板处理,得到各点所在强连通分支,再通过出度判断,即可求解。代码:#include <iostream>#include <string.h>using namespace std;con...原创 2018-08-31 22:27:36 · 175 阅读 · 0 评论 -
JSK-习题:威虎山上的分配-拓扑排序
思路:若a比b钱少,则从a连向b,进行一次拓扑排序后,即可从小到大确定顺序代码:#include <iostream>#include <string.h>#include <algorithm>#include <queue>#include <math.h>using namespace std;const...原创 2018-08-31 22:26:01 · 212 阅读 · 0 评论 -
JSK-习题:判断欧拉回路-欧拉图
思路:使用无向图找欧拉图模板判断联通性,再由欧拉图的性质,即可判断欧拉图性质:无向图:联通+所有点的度数为偶数 无向图:联通+所有点的入度数=出度数代码:#include <iostream>#include <string.h>using namespace std;const int MAX_N=10...原创 2018-08-31 22:24:23 · 876 阅读 · 0 评论 -
2018HDU多校7-1001-Age of Moyu(hdu 6386)-最短路变形
题意:给出一个无向图,每个边有一个标号,在标号相同的边上走不增加花费,每走到标号不同的边上时,花费+1,求从1~n的最小花费 (狗才摸鱼..)思路:与最短路问题极为相似,考虑对最短路算法进行修改 在spfa算法的基础上,遍历每个点,使用set记录由哪条边到达该点,若花费相同时,优先选由相同标号边到达的点,不同时按照正常spfa选择花费小的点,这样既可得到答案...原创 2018-08-31 00:12:34 · 185 阅读 · 0 评论 -
2018HDU多校8-1010-Taotao Picks Apples(hdu 6406)-线段树+预处理
题意:给出一个数列,每次修改其中一个数,求该数列的严格最长上升序列(只要后一个数大于之前最大数,就必须要选)思路:先讨论全部情况,可得到以下结论,对于一个修改p,q,以p位置为断点,分别考虑1~p-1,和p+1~n两段 对于前段,若q>premax[p-1],则表示修改后的p位置一定会被选,则ans+=pre[p-1]+1 ...原创 2018-08-31 00:11:02 · 157 阅读 · 0 评论 -
2018HDU多校3-Problem A. Ascending Rating(hdu 6319)-单调队列
题意:给定一个长度为n的序列,给出前k个值,后面根据公式自己算。现在问你每个区间长度为m的子序列最大值异或上i和最大值变化次数异或上i的求和。思路:有些时候若正向考虑不行,就尝试反向考虑,此题应将数列反向存入单调队列中,反向维护递减队列,即是正向的递增。 这样,队列中元素的个数就是所求的count值,队首元素即是最大值代码:#include <i...原创 2018-08-31 00:09:24 · 119 阅读 · 0 评论 -
2018HDU多校3-Problem D. Euler Function(hdu 6322)-数论、规律
题意:给一个k,求第k小的正整数n,使得φ(n)是一个合数,φ(n)表示n的欧拉函数值思路:本题根据欧拉函数性质可直接推出,也可先打表,再猜规律 欧拉函数性质,当n大于6时,所以φ(n)都是合数代码:#include<bits/stdc++.h>using namespace std;#define ll long long#d...原创 2018-08-31 00:07:20 · 203 阅读 · 0 评论 -
2018HDU多校3-Problem F. Grab The Tree(hdu 6324)-博弈
题意:Q和T两人玩游戏,Q先手,从一棵树中选择若干个点,并得到这些点的异或和,要求不能同时选取相邻的两点。Q选完后,T取剩余的点,谁取的这些点的异或和大谁获胜,问比赛结果思路:看到两人玩游戏,看到先后手,考虑博弈。 分两种情况讨论,Q=T时,则两人所取点的异或和相同,由异或运算法则可得,Q^T=0,即所有点的异或和为0 ...原创 2018-08-31 00:05:53 · 153 阅读 · 0 评论