算法竞赛入门经典训练指南-第三章
文章平均质量分 78
lab104_yifan
这个作者很懒,什么都没留下…
展开
-
UVA 10526 - Intellectual Property (后缀数组)
UVA 10526 - Intellectual Property题目链接题意:给定两个问题,要求找出第二个文本抄袭第一个文本的所有位置和长度,输出前k个,按长度从大到小先排,长度一样的按位置从小到大思路:后缀数组,把两个文本拼接起来,记录下拼接位置为tdp,这样如果sa[i] = tdp就是后面的文本开头,拼接起来的求出height数组,利用该数组的性质,从前往后扫一遍,原创 2014-08-23 10:26:02 · 1511 阅读 · 0 评论 -
UVA 11888 - Abnormal 89's(Manachar)
UVA 11888 - Abnormal 89's题目链接题意:给定一个字符串,判断类型,一共三种,两个回文拼接成的,一个回文,其它思路:利用Manachar处理出每个位置的最长回文,然后扫描一遍去判断即可代码:#include #include #include using namespace std;const int N = 200005;原创 2014-08-21 23:31:51 · 1039 阅读 · 0 评论 -
UVA 11855 - Buzzwords(后缀数组)
UVA 11855 - Buzzwords题目链接题意:给定一个文本,求出长度为1, 2, 3, 4, 5....的字符串最大出现次数,一直找到出现次数不大于1为止思路:后缀数组,把空格去掉得到一个字符串,构造height数组,然后就是后缀数组的简单应用了,找连续一段最长的段并且都大于当前正在查找的长度代码:#include #include #incl原创 2014-08-22 15:27:23 · 982 阅读 · 0 评论 -
UVA 12012 - Detection of Extraterrestrial(KMP)
UVA 12012 - Detection of Extraterrestrial题目链接题意:给定一个字符串,求其所有子串中,对应1-n循环次数的最长串长度思路:KMP,n才1000,可以接受O(n^2)的算法,对于每个后缀串,做一次KMP,然后在遍历一遍KMP数组,这样就可以得到每个子串的所有循环次数了,然后不断更新答案即可代码:#include #i原创 2014-08-22 11:38:58 · 1153 阅读 · 0 评论 -
UVA 1358 - Generator(dp+高斯消元+KMP)
UVA 1358 - Generator题目链接题意:有m种字符(从'A'开始往后数的大写字母),现在有一个字符串,长度不超过12,现在每次随机生成一个字母,要求能产生该字符串的期望长度思路:dp[i]表示产生长度i的期望长度,那么每次产生一个字符,对应m种转移,每种转移的概率为1/m,转移后的长度可以利用KMP的next数组去快速获得,然后由于转移可能形成环的情况,所以无原创 2014-08-23 11:41:28 · 1282 阅读 · 0 评论 -
UVA 1076 - Password Suspects(AC自动机+DP)
UVA 1076 - Password Suspects题目链接题意:一个密码,给定m个已知子串,求这个密码最多有几种表示方式,如果小于42种,就输出这些密码思路:先利用已有子串构造AC自动机,需要改造一下的地方是每个叶子结点为(1代码:#include #include #include #include #include #include u原创 2014-08-22 16:22:02 · 2680 阅读 · 0 评论 -
UVA 1462 - Fuzzy Google Suggest(字典树+dfs)
UVA 1462 - Fuzzy Google Suggest题目链接题意:要模拟谷歌的模糊搜索,先有一些文本,然后每次输入一个单词查询,这个单词可以进行最多ti次操作,每次操作可以删除一个字符,修改一个字符,或增添一个字符,问这样这个单词最多可以匹配多少个前缀思路:先建好字典树,每个结点保存经过的次数,然后每次查询,就在字典树上进行dfs,对于找到的结点标记为2,路径标记原创 2014-08-22 20:59:51 · 1392 阅读 · 0 评论 -
UVA 719 - Glass Beads (最小表示法)
UVA 719 - Glass Beads题目链接题意:就是求最小表示法的位置思路:最小表示法裸题代码:原创 2014-08-20 20:29:58 · 1201 阅读 · 0 评论 -
UVA 475 - Wild Thing(KMP)
UVA 475 - Wild Thing题目链接题意:给定一个带通配符的文件名作为格式,后面跟一个文件名,要求输出符合格式的文件名思路:先把带通配符的文件名根据星号位置进行分解,然后对于每个文件名去判断,判断的方法用KMP,如果格式的每段都能在文件名中不断往后一一匹配上,那么就是可以的,注意考虑开头和结尾没有星号的情况,还有这题就是如果找不到一个合适的,就什么都不输出,包括原创 2014-08-20 17:58:07 · 986 阅读 · 0 评论 -
UVA 282 - Rename(字符串处理)
UVA 282 - Rename题目链接题意:给定一些文件名,然后有利用通配符'*'去进行修改操作,输出每次修改操作会修改到的文件的替换思路:先保存下文件名,然后每次改名去遍历找一遍看有多少个文件是符合这个格式的,如果符合就相应输出即可注意这组数据abababendrename ab*ab asd*asdend代码:#includ原创 2014-08-20 16:07:17 · 939 阅读 · 0 评论 -
UVA 1556 - Disk Tree(Trie)
UVA 1556 - Disk Tree题目链接题意:给定一些字符串,表示目录,要求输出整体目录的结构思路:跟Trie树差不多,只不过是每个结点存放的是一个字符串,利用map映射即可代码:#include #include #include #include #include #include #include using namespace原创 2014-08-20 15:11:55 · 2775 阅读 · 0 评论 -
UVA 12338 - Anti-Rhyme Pairs(后缀数组+RMQ)
UVA 12338 - Anti-Rhyme Pairs题目链接题意:给定一些字符串,每次询问求出两个字符串的最长公共前缀的长度思路:把字符串排序,就能求出height和rank数组,然后利用RMQ查询即可代码:#include #include #include #include #include using namespace std;co原创 2014-08-20 01:00:23 · 1286 阅读 · 0 评论 -
UVA 261 - The Window Property(字符串Hash)
UVA 261 - The Window Property题目链接题意:这题题意挺绕的。。就是给定一个字符串长度n,扫描长度为k = [1,n],然后每次只能扫描连续k个字符的子串,要求所有扫描中,每次扫描中出现的不同字符串个数都不超过k + 1,那么这个字符串就是window property,如果不是的话,就还要找出下标最小的不符合的位置(就是n次扫描中找最小的)思路:原创 2014-08-20 14:41:51 · 1254 阅读 · 0 评论 -
UVA 257 - Palinwords(字符串HASH)
UVA 257 - Palinwords题目链接题意:输出一个文本里面的palinword,palinword的定义为,包含两个不同的回文子串,并且要求回文子串不能互相包含思路:对于每个单词判断一次,由于不能互相包含,对于每个位置,其实就只要找长度3和4的情况即可,这样复杂度为O(n),至于判断重复的,就用hash即可代码:#include #include原创 2014-08-20 13:38:59 · 1935 阅读 · 0 评论 -
UVA 1314 - Hidden Password(最小表示法)
UVA 1314 - Hidden Password题目链接题意:题意其实就是,给一个字符串,求它的最小表示思路:最小表示法代码:#include #include const int N = 100005;int n, t;char str[N];int solve() { int i, j, l; i = 0; j = 1原创 2014-08-20 20:43:27 · 1266 阅读 · 0 评论 -
UVA 1399 - Puzzle(AC自动机+DP)
UVA 1399 - Puzzle题目链接题意:给定一些字符串,求一个最长的不在包含这些子串的字符串,如果可以无限长输出No思路:建ACM自动机,把不可走结点标记构造出来,然后在这个状态图上进行dp找出最长路径即可,至于无限长的情况,只要在dp前进行一次dfs判有没有环即可代码:#include #include #include #include原创 2014-08-19 21:53:31 · 1151 阅读 · 0 评论 -
UVA 1519 - Dictionary Size(Trie树)
UVA 1519 - Dictionary Size题目链接题意:有一个字典,里面包含一些词,要求组合新词,新词必须来自原字典,或者由原字典的字符串的非空前缀和非空后缀组成,问一共能组成多少个新词思路:建Trie树,可以求出不同的前缀和后缀个数,然后相乘,这样做会有一部分重复的比如Aaaa,aaaA的情况,就重复了,去重的方法可以推理出来假设前缀A后面有x个a,后缀原创 2014-08-19 00:41:48 · 1965 阅读 · 0 评论 -
UVA 12206 - Stammering Aliens(后缀数组)
UVA 12206 - Stammering Aliens题目链接题意:给定一个序列,求出出现次数大于m,长度最长的子串的最大下标思路:后缀数组,搞出height数组后,利用二分去查找即可这题之前还写过hash的写法也能过,不过写后缀数组的时候,犯了一个傻逼错误,把none输出成node还一直找不到。。。这是刷题来第二次碰到这种逗比错误了,还是得注意。。代码原创 2014-08-18 22:49:22 · 1583 阅读 · 0 评论 -
UVA 10829 - L-Gap Substrings(后缀数组)
UVA 10829 - L-Gap Substrings题目链接题意:一个字符串如果形如UGU,的形式,G的长度为L,那么称这个字符串为L串,给定一个字符串,问这个字符串子串为g串的个数思路:做这题前先做了POJ3693,有一个思想就是枚举长度分段,这样的话对于一个U长度为l的而言,只要在当前位置和当前位置之后(l + g)的位置分别向前向后找lcp,两个lcp加起来的长度原创 2014-08-23 19:50:45 · 2057 阅读 · 0 评论 -
UVA 11020 - Efficient Solutions(set)
UVA 11020 - Efficient Solutions题目链接题意:每个人有两个属性值(x, y),对于每一个人(x,y)而言,当有另一个人(x', y'),如果他们的属性值满足x' 思路:由于每个人失去优势后,不可能再得到优势,所以失去优势就可以当成删去这些点,这样的话,就可以用一个multiset来维护点集,每次加入一个点,利用lowerbound,upper_原创 2014-08-24 00:27:07 · 1682 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring(后缀数组神题)
POJ 3693 Maximum repetition substring题目链接题意:给定一个字符串,求出其子串中,重复次数最多的串,如果有相同的,输出字典序最小的思路:枚举长度l,把字符串按l分段,这样对于长度为l的字符串,肯定会包含一个分段位置,这样一来就可以在每个分段位置,往后做一次lcp,求出最大匹配长度,然后如果匹配长度有剩余,看剩余多少,就往前多少位置再做一次原创 2014-08-23 18:51:02 · 1154 阅读 · 0 评论 -
UVA 11107 - Life Forms(后缀数组)
UVA 11107 - Life Forms题目链接题意:给定一些字符串,求最长并且在所有字符串的连续子串中出现超过一半次数的字符串,输出这些字符串思路:把这些字符串接起来,拼接部分用一个不会出现的不重复的字符,然后求这个长串的后缀数组,利用height数组去进行二分求解,二分的判断里面如果有一个连续height段超过了一半次数,那么就是可行的,如果所有连续段都没有出现超过原创 2014-08-18 16:34:49 · 1280 阅读 · 1 评论 -
UVA 11019 - Matrix Matcher(AC自动机 | hash大法)
UVA 11019 - Matrix Matcher题目链接题意:给定两个矩阵字符串,要求第二个矩阵在第一个矩阵的出现次数思路:第二个矩阵按行拆分成自动机,然后用第一个矩阵一行一行去匹配,利用一个rc[N][M]的数组记录下每个左上角对应位置的成功匹配次数,然后找完后,对于每个位置,如果成功匹配次数为x,那么就是成功匹配上了,ans++代码:#include原创 2014-08-02 15:09:07 · 1695 阅读 · 0 评论 -
UVA 12206 - Stammering Aliens(Hash+LCP)
UVA 11107 - Life Forms题目链接题意:给定一个字符串,找出重复出现超过m次的字串的最大开始下标思路:hash大法,需要点人品,然后二分答案,每次利用hash值去找出最大下标即可代码:#include #include #include using namespace std;typedef unsigned long long原创 2014-08-17 16:27:46 · 1084 阅读 · 0 评论 -
UVA 11423 - Cache Simulator(树状数组)
UVA 11423 - Cache Simulator题目链接题意:题目讲的大概就是几个cash,每次操作可以加入一个或一些数据,如果数据之前有就是hit,命中后的数据就不会消失,如果没有就miss,当容量超过cash容量时,就会把之前最早没命中的一个丢掉,每次START就执行这些命令,计算miss次数并输出思路:由于最多就2^24的数据,所以可以开一个树状数组,每个位置表原创 2014-08-16 20:04:14 · 1681 阅读 · 0 评论 -
UVA 1492 - Adding New Machine(线段树)
UVA 1492 - Adding New Machine题目链接题意:给定一些旧机器管辖范围,现在要放一台进新机器,新机器需要空间1*m,问有多少种放法思路:转化为求面积并的问题,先考虑横放,对于旧机器左边m个位置肯定不能放,还有边界w-m之后的位置肯定不能放,这样就可以把旧机器向左扩大m个位置,并且边界多上一块m*h大小的面积,这样求出这些面积并再用总面积减去即可,求面原创 2014-08-17 14:25:34 · 1234 阅读 · 0 评论 -
UVA 1406 - A Sequence of Numbers(树状数组)
UVA 1406 - A Sequence of Numbers题目链接题意:给定一些数字,每次操作C x 表示所有数字加上xQ x 表示答案加上与2x进行且操作不为0的个数E 结束,并输出答案思路:树状数组,首先观察,对于每次查询x而言,只有前x位是是有用的,所以可以开16个树状数组,每个数组表示数字对应前x位下的数字,然后就可以搞了,已经现在加过值为sum,原创 2014-08-16 16:42:13 · 1192 阅读 · 0 评论 -
UVA 1493 - Draw a Mess(并查集)
UVA 1493 - Draw a Mess题目链接题意:在一个n*m平面上,有4种操作,对应把相应区域颜色涂成v(1思路:并查集,由于颜色涂上去会覆盖,这样我们就可以反向执行操作,这样保证每次操作如果之前有颜色就不能涂,如果没有就可以涂,然后一共有200行,每行都利用并查集压缩路径,查找下一个能涂色的位置即可题目中说三角形边一定是奇数,可居然有偶数的。。。被这个坑原创 2014-08-15 18:45:34 · 953 阅读 · 0 评论 -
UVA 10869 - Brownie Points II(树状数组)
UVA 10869 - Brownie Points II题目链接题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线,然后另一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分出4个象限,第一个人得到分数为1,3象限,第二个人为二四象限,问第一个个人按最优取法,能得到最小分数的最大值,和这个值下另一个人的得分可能情况思路:树状数组,可以枚举一点,如果能求出原创 2014-08-16 23:26:56 · 1034 阅读 · 0 评论 -
UVA 12130 - Summits(BFS+贪心)
UVA 12130 - Summits题目链接题意:给定一个h * w的图,每个位置有一个值,现在要求出这个图上的峰顶有多少个。峰顶是这样定义的,有一个d值,如果一个位置是峰顶,那么它不能走到不大于该峰顶高度 - d的位置,如果满足这个条件下,并且无法走到更高的山峰,那么它就是峰顶思路:利用贪心的策略,把所有点丢到优先队列,每次取出最高的峰值开始找,进行广搜,搜的过程中记录原创 2014-08-14 00:50:20 · 1326 阅读 · 5 评论 -
11922 - Permutation Transformer (Splay区间翻转)
UVA 11922 - Permutation Transformer题目链接题意:给一个序列,每次操作选择(a,b),把(a,b)序列翻转之后加到末尾,求最终序列思路:Splay的应用,多一个flip标记,在开头多一个虚拟的0结点,这样每次就利用Splay进行分裂合并即可代码:#include #include #include #include原创 2014-08-26 20:43:46 · 861 阅读 · 0 评论 -
UVA 1471 - Defense Lines(扫描+二分)
UVA 1471 - Defense Lines题目链接题意:给定一个序列,要求删去一个连续子序列后,得到的序列有一个最长的连续递增序列,输出最长连续递增序列长度思路:先左右扫描一遍,把每个位置往左和往右的最大长度记录下来,然后在从左往右扫描一遍,开一个数组Min用来记录长度i的序列,最后一位的最小值,这个序列是满足单调性的,因为递增序列肯定是1,2,3,4...这样不断往原创 2014-08-25 14:04:08 · 1951 阅读 · 0 评论 -
UVA 1479 - Graph and Queries(Treap)
UVA 1479 - Graph and Queries题目链接题意:给定一个n个结点m条边的无向图,每个结点一个权值,现在有3种操作D x,删除id为x的边Q x k 计算与x结点的连通分量中第k大的数字,不存在就是0C x v 把x结点权值改为v要求计算所有Q操作的和除以Q操作的次数的值思路:Treap的经典题,进行离线操作,把操作全部逆向进行,删边原创 2014-08-25 20:03:25 · 1009 阅读 · 0 评论 -
UVA 10821 - Constructing BST(贪心构造)
UVA 10821 - Constructing BST题目链接题意:有1 - n的数字,要构造一棵高度不超过h的BST,并且要字典序最小的,输出序列思路:贪心构造,既然字典序最小,那么每个子树的根都要尽量小,那么也就是右子树尽量填满,按照这个策略去dfs构造即可代码:#include #include #include using namespace原创 2014-08-25 14:53:31 · 1185 阅读 · 0 评论 -
UVA 1264 - Binary Search Tree(BST+计数)
UVA 1264 - Binary Search Tree题目链接题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是相同的(包括原序列)思路:先建树,然后dfs一遍,对于一个子树而言,只要保证左边和右边顺序对就可以了,所以种数为C(左右结点总数,左结点),然后根据乘法原理乘上左右子树的情况即可代码:#include #include t原创 2014-08-25 11:30:00 · 1478 阅读 · 0 评论 -
uva 12096 - The SetStack Computer(STL)
UVA 12096 - The SetStack Computer题目链接题意:几个操作,push是在栈顶加入一个空集,dup是复制栈顶集合,在放入栈顶,union是把头两个取并集放回,int是头两个取交集放回,add是取头两个,把第一个当成一个集合加入第二个,每次操作输出栈顶集合的里面的个数思路:用set,stack模拟,然后利用map去hash一个集合,模拟即可原创 2014-08-13 21:06:05 · 1152 阅读 · 0 评论 -
UVA 10909 - Lucky Number(树状数组)
UVA 10909 - Lucky Number题目链接题意:问一个数字能否由两个lucky num构造出来,lucky num根据题目中的定义思路:利用树状数组找前k大的方法可以构造出lucky num的序列,然后每次查找n,就从n / 2开始往下查找即可代码:#include #include #include using namespace st原创 2014-08-24 23:41:20 · 1446 阅读 · 0 评论 -
UVA 11557 - Code Theft (KMP + HASH)
UVA 11557 - Code Theft题目链接题意:给定一些代码文本,然后在给定一个现有文本,找出这个现有文本和前面代码文本,重复连续行最多的这些文本思路:把每一行hash成一个值,然后对于每一个文本计算最大匹配值,枚举后缀,然后利用KMP去找即可代码:#include #include #include #include #include原创 2014-08-23 22:52:00 · 1309 阅读 · 0 评论 -
UVA 1328 - Period (KMP)
UVA 1328 - Period题目链接题意:给定一个字符串,求出有几个位置的前缀串是由个数大于1的串循环得到的,求出位置和循环次数思路:利用kmp的next数组的性质,i - next[i]就是循环长度,然后判断一下是不是正好是倍数即可代码:#include #include const int N = 1000005;int n, next[原创 2014-08-01 11:04:08 · 1648 阅读 · 0 评论 -
UVA 11402 - Ahoy, Pirates!(线段树)
UVA 11402 - Ahoy, Pirates!题目链接题意:总的来说意思就是给一个01串,然后有3种操作1、把一个区间变成12、把一个区间变成03、把一个区间翻转(0变1,1变0)思路:线段树搞,开一个延迟标记当前操作即可,注意几种状态间的转变方式即可代码:#include #include #include using namesp原创 2014-07-30 23:27:58 · 1681 阅读 · 0 评论