
训练指南-第三章
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
uva 719 - Glass Beads(最小表示法 | 后缀自动机)
题目链接:uva 719 - Glass Beads题目大意:给定一个字符串,求最小表示法。解题思路:最小表示法。#include #include #include using namespace std;const int maxn = 1e4+5;char s[maxn];int main () { int cas; scanf("%d原创 2014-09-04 23:11:08 · 2073 阅读 · 0 评论 -
uva 1492 - Adding New Machine(线段树)
题目链接:uva 1492 - Adding New Machine题目大意:在一个R∗C矩阵上有N台旧的机器,给定每个机器的占地,现在要添加一台1∗M的机器,问有多少种摆放方法。解题思路:问题可以转化成矩形覆盖问题,对于每台旧的机器,假设考虑对应每个位置向右放,那么左边的M-1个位置是不能放的,以及右边界左边的M-1个位置。用线段树解决矩形覆盖,x,y坐标分别处理一次。注意M=1原创 2014-08-27 17:21:54 · 1229 阅读 · 0 评论 -
uva 1455 - Kingdom(并查集+线段树)
题目链接:uva 1455 - Kingdom题目大意:平面上又n个城市,初始时城市之间没有任何双向道路相连,要求一次执行指令。road A B :在城市A和城市B之间连接一条双向道路line C:询问一条y=C的水平线上穿过多少州和这些州总共有多少城市。一个联通分量算一个州,C保证为小数部分为0.5的实数。解题思路:线段树维护每个位置上州和城市的个数,并查集维护哪些城原创 2014-08-28 00:16:06 · 1450 阅读 · 0 评论 -
uva 10298 - Power Strings(KMP)
题目链接:poj 2406 Power Strings题目大意:给出一个字符串,求出该字符串是由几个最小循环节组成的。解题思路:KMP, n-next[n]即为最小循环节。#include #include const int N = 1000005;int n, next[N];char s[N];void getNext () { in原创 2014-03-19 21:57:38 · 2345 阅读 · 0 评论 -
uva 1401 - Remember the Word(字典树+dp)
题目链接:uva 1401 - Remember the Word题目大意:给出一个由S个不同单词组成的字典和一个长字符串。吧这个字符串分解成若干个单词的连接,有多少种方法。解题思路:dp(i) = sum{ dp(i+len(x))}, 单词x为S[i...L]的前缀。#include #include #include using namespace std;c原创 2014-08-28 21:07:41 · 852 阅读 · 0 评论 -
uva 11732 - strcmp() Anyone?(字典树)
题目链接:uva 11732 - strcmp() Anyone?题目大意:给定n个串,然后两两之间比较,问说总共要比较多少次。解题思路:字典树,建立出字典树,然后根据字典树的性质在节点记录有多少个字符串包含该节点。因为节点的个数比较多,所以用左孩子右兄弟的方法建立字典树。#include #include #include using namespace std;t原创 2014-08-28 21:14:14 · 1098 阅读 · 0 评论 -
uva 11019 - Matrix Matcher(AC自动机)
题目链接:uva 11019 - Matrix Matcher题目大意:给出一个n∗m的字符矩阵T,要求找出给定r∗c的字符矩阵P在T中出现的次数。解题思路:对P矩阵中的每一行做一个字符串,形成一个字符串集合。构建AC自动机,然后对T矩阵中的每一行进行一次查找,对应出现在该字符串中的子串对应位置+1,如果有一个位置上r次匹配,那么就存在一个匹配矩阵。#include #inc原创 2014-08-28 21:41:14 · 1591 阅读 · 0 评论 -
uva 11488 - Hyper Prefix Sets(字典树)
题目链接:uva 11488 - Hyper Prefix Sets题目大意:给出若干个由01组成的字符串,求一个前缀串,长度为k,出现在n个字符串中,输出最大的k*n解题思路:建立字典树,对应在节点上记录次数即可。维护最大值。#include #include #include #include using namespace std;const int maxn原创 2014-08-28 21:44:43 · 1024 阅读 · 0 评论 -
uva 10821 - Constructing BST(BSF)
题目链接:uva 10821 - Constructing BST题目大意:给定节点个数以及树的高度,求一个字典序最小的插入顺序,使得生成的BST高度为H。解题思路:根据H来确定说左右子树的节点个数,因为要求字典序尽量小,所以右子树的节点个数应该尽量多。#include #include #include using namespace std;int N, H;原创 2014-09-16 16:31:41 · 1290 阅读 · 0 评论 -
uva 1406 - A Sequence of Numbers(树状数组)
题目链接:uva 1406 - A Sequence of Numbers题目大意;给定n个数,有两种操作:Q x:计算与2x取且不为0的数的个数C x:每个数加上x输出所有Q操作的和。解题思路:因为x最大为15,所以开16个树状数组,fenx[x]记录的是每个数取模2x+1的情况,然后有一个add值标记总共加了多少。根据add值确定原先数的范围。#include原创 2014-08-27 17:16:05 · 1282 阅读 · 0 评论 -
uva 11898 - Killer Problem(暴力)
题目链接:uva 11898 - Killer Problem题目大意:给定一个序列,每次询问l到r之间两个数差的绝对值的最小值。解题思路:因为数字的最大值为104,所以l~r区间长度大于104的直接就是0了,否则用计数方法直接暴力去搞。#include #include #include using namespace std;const int maxc = 1e原创 2014-08-27 16:50:00 · 1217 阅读 · 0 评论 -
uva 12299 - RMQ with Shifts(线段树)
题目链接:uva 12299 - RMQ with Shifts题目大意:给定一个数组,有两种操作。query l r:查询l到r之间的最小值shift x1 x2 x3:将下标为x1 x2 x3的位置上的数循环移动一个长度。解题思路:线段树维护最小值,因为每条命令的长度不会超过30,所以循环移动的数并不会很多,用单点修改去处理。#include #include原创 2014-08-25 14:17:52 · 1254 阅读 · 0 评论 -
uva 1328 Period(KMP)
题目链接:hdu 1358 Period题目大意:给出一个长度为n的字符串,要求找到一些i,满足说从1~i为两个的重复子串构成,并输出子串的个数。解题思路:KMP,只是在求next数组的时候,对于每个位置的next[i]都进行判断,如果i%(i-next[i]) = 0,即为满足的位置。#include #include const int N = 1e6原创 2014-03-18 17:02:03 · 1424 阅读 · 0 评论 -
uva 11983 - Weird Advertisement(线段树)
题目链接:uva 11983 - Weird Advertisement题目大意:给定n个矩形,问说有多少区域的面积被覆盖k次以上。解题思路:将每个矩形差分成两条线段,一段为添加覆盖值1,一段为减少覆盖值1,同时记录两段的高度(横坐标)。然后对纵坐标离散化建立线段树,然后对线段按照高度排序,维护整段区间中覆盖度大于K的长度,乘上高度上的范围即可。#include #inclu原创 2014-08-27 16:45:43 · 1180 阅读 · 0 评论 -
uva 11423 - Cache Simulator(树状数组)
题目链接:uva 11423 - Cache Simulator题目大意;模拟一个cache,4种操作:ADDR x:访问一个x地址RANGE x y n:访问x + y * k (0≤kSTAT:输出每个大小的cache,MISS的次数END:结束按照从小到大的顺序给cache的大小。解题思路:因为访问的次数不会大于1e7次,所以预先处理出访问的序列,然后对于每个原创 2014-08-27 17:04:45 · 1476 阅读 · 0 评论 -
uva 1493 - Draw a Mess(并查集)
题目链接:uva 1493 - Draw a Mess题目大意:给定一个矩形范围,有四种上色方式,后面上色回将前面的颜色覆盖,最后问9种颜色各占多少的区域。解题思路:用并查集维护每个位置对应下一个可以上色的位置。然后将上色倒转过来处理,就解决了颜色覆盖的问题。#include #include #include #include #include using nam原创 2014-08-28 00:13:11 · 1553 阅读 · 0 评论 -
uva 10869 - Brownie Points II(树状数组)
题目链接:uva 10869 - Brownie Points II题目大意:给定若干点,第一个人选中一个存在点的横坐标,第二个人选中该横坐标上的一点,以该点作原点建立坐标系,一、三象限的点属于第一个人,二、四象限属于第二个人,坐标轴上的不属于任何人。问说在第一个人获得点最多的情况下第二个人可能获得多少点。解题思路:将所有点按照x坐标从小到大,y坐标从大到小排序,这样从左向右可以处原创 2014-08-27 17:11:40 · 1140 阅读 · 0 评论 -
uva 1449 - Dominating Patterns(AC自动机)
题目练级:uva 1449 - Dominating Patterns题目大意:有一个由小写字母组成的字符串集和一个文本T,要求找出那些字符串在文本中出现的次数最多。解题思路:将字符串集建立AC自动机,然后传入T进行匹配,对每个匹配上的字符串多应次数加1,最后找出最大值。出现次数与最大值相同的字符串输出。注意字符集中出现相同字符的情况。#include #include #原创 2014-08-28 21:19:29 · 1146 阅读 · 0 评论 -
uva 11468 - Substring(AC自动机+概率)
题目链接:uva 11468 - Substring题目大意:给出一些字符和各自字符对应的选择概率,随机选择L次后得到一个长度为L的字符串,要求该字符串不包含任意一个子串的概率。解题思路:构造AC自动机之后,每随机生成一个字母,等于是在AC自动机上走一步,所有子串的结束位置的节点标记为禁止通行,然后问题转换成记忆搜索处理。#include #include #include原创 2014-08-28 21:29:25 · 1105 阅读 · 0 评论 -
uva 11988 Broken Keyboard(字符串处理+ STL)
Broken Keyboard (a.k.a. Beiju Text)You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "原创 2013-08-08 00:26:32 · 1272 阅读 · 0 评论 -
uva 1399 - Puzzle(AC自动机)
题目链接:uva 1399 - Puzzle题目大意:给定K和N,表示有K种不同的字符,N个禁止串,求一个最长的串使得该串不包含任何禁止串为子串。如果存在循环或者不能构成的话,输出No。解题思路:建立AC自动机,然后在AC自动机上做dp,所有单词结尾节点为禁止点。#include #include #include #include using namespace s原创 2014-09-01 22:17:34 · 1255 阅读 · 0 评论 -
uva 12338 - Anti-Rhyme Pairs(后缀数组+RMQ)
题目链接:uva 12338 - Anti-Rhyme Pairs题目大意:给定若干个字符串,每次询问两个字符串的最长公共前缀。解题思路:本来应该将每个字符串连接起来做后缀数组,但其实可以直接把一个字符串看成是一个字符,然后排序了就对应是SA数组,然后处理height即可。然后根据后缀数组的性质,字符串i和j的最长公共前缀长度即为rank[i]+1~rank[j]之间height的原创 2014-09-02 22:45:47 · 1105 阅读 · 0 评论 -
uva 1556 - Disk Tree(字典树)
题目连接:uva 1556 - Disk Tree题目大意:给出N个目录关系,然后按照字典序输出整个文件目录。解题思路:以每个目录名作为字符建立一个字典树即可,每个节点的关系可以用map优化。#include #include #include #include #include #include using namespace std;const int ma原创 2014-09-02 22:36:44 · 3636 阅读 · 0 评论 -
uva 1264 - Binary Search Tree(BST)
题目链接:uva 1264 - Binary Search Tree题目大意:给定一个插入顺序,要求输出有多少种插入顺序,使得生成的BST一样。解题思路:组合数学+BST的性质,起始左右两个子树的节点之间是没有影响的。所以逐层递推上去即可。#include #include #include using namespace std;typedef long long原创 2014-09-16 09:55:58 · 1323 阅读 · 0 评论 -
uva 10909 - Lucky Number(树状数组)
题目链接:uva 10909 - Lucky Number题目大意:定义Lucky Number, 给定一个数n,输出有两个差值最小Lucky Number,x和y,要求x+y=n。解题思路:根据Lucky Number定义,用树状数组预处理出所有的Lucky Number,然后对于每个n,用二分找到最接近n/2的Lucky Number,然后去枚举。#include #in原创 2014-09-16 16:54:34 · 1439 阅读 · 0 评论 -
uva 10526 - Intellectual Property(后缀数组)
题目链接:uva 10526 - Intellectual Property题目大意:给定两个文本,问说下面一个文本中在哪些位置上抄袭了上面个一个文本的,输出n个抄袭位置(不足n个情况全部输出),按照长度优先输出,长度相同的输出位置靠前的。注意:空格,回车都算一个字符;一段字符只能是抄袭上面的一部分,比如上:NSB*SB 下:NSB 答案:NSB。解题思路:将两个文本连接在一起原创 2014-09-04 22:24:59 · 1464 阅读 · 0 评论 -
uva 11557 - Code Theft(KMP)
题目链接:uva 11557 - Code Theft题目大意:给定n个文本,每个文本有一个文本名,现在给出一个文本,求给定文本和n个文本中连续相同行数最大值,并且输出文本名,注意为0时不用输出其它的文本名。解题思路:将每个字符串用映射成一个hash值,然后对匹配文本枚举后缀,建立失配数组进行KMP匹配,记录下每个文本的匹配最大值。#include #include #in原创 2014-09-04 22:27:34 · 935 阅读 · 0 评论 -
uva 1358 - Generator(KMP+期望)
题目链接:uva 1358 - Generator题目大意:给定n,表示有n中字符,然后给定一个字符串S,一开始字符串为空,现在每次随机生成一个1~n的字符添加到字符串末尾,问说字符串包含S为子串的生成次数期望。解题思路:首先要对S进行预处理,求出失配数组。定义dp[i]表示末尾部分匹配了i个S串所需要的次数期望,每次枚举可能出现的字符1~n。对于S字符串,i+1肯定是确定原创 2014-09-04 22:07:43 · 1539 阅读 · 0 评论 -
uva 1479 - Graph and Queries(伸展树)
题目链接:uva 1479 - Graph and Queries题目大意:有一张m条边的无向图,每个节点都有一个权值,现在有若干个操作,D x:删除ID为x的节点Q x k:计算与节点x联通的节点当中,第k大的权值C x v:把节点x的权值改为v解题思路:把所有操作反过来处理,先执行所有的D操作,获得最终的图,然后逆操作的时候对于D来说即为合并操作,Q和C则是查询和修改操原创 2014-09-16 09:42:25 · 1285 阅读 · 0 评论 -
uva 257 - Palinwords(哈希字符串)
题目链接:uva 257 - Palinwords题目大意:判定一个字符串是否有两个互相不为子串的回文串为子串。解题思路:枚举长度为3和4的字符串,然后将每个字符串映射成一个hash值。#include #include #include #include using namespace std;const int maxn = 500;char word[m原创 2014-09-02 22:30:01 · 1525 阅读 · 0 评论 -
uva 1471 - Defense Lines(高效)
题目链接:uva 1471 - Defense Lines题目大意:给定一个序列,删除一段连续的序列后,使得现在序列中连续的递增序列尽量长。解题思路:维护单调即可,即连续长度最长的情况下结尾的小值,然后对于新的一段,用二分找到满足的连接处。#include #include #include using namespace std;const int maxn = 2原创 2014-09-15 20:19:20 · 1365 阅读 · 0 评论 -
uva 1519 - Dictionary Size(字典树)
题目链接:uva 1519 - Dictionary Size题目大意:给出n个字符串组成的字典,现在要添加新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词。问说能组成多少个单词。解题思路:建立一棵前缀树和一棵后缀树,有多少节点即为有多少个前缀,扣除中间的部分即可加上长度为1的字符串即可。#include #include #include using name原创 2014-09-01 22:12:24 · 1717 阅读 · 0 评论 -
uva 11107 - Life Forms(后缀数组)
题目链接:uva 11107 - Life Forms题目大意:给定n个字符串,求一个最长的字符串,为n/2个字符串的子串。解题思路:后缀数组,处理除后缀数组后,二分长度,每次遍历height数组,当长度不足时就分段,如果存在一段中包含n/2个起点,则为可行长度。#include #include #include #include using namespace s原创 2014-09-01 21:49:59 · 1563 阅读 · 0 评论 -
uva 11475 - Extend to Palindrome(KMP)
题目链接:uva 11475 - Extend to Palindrome题目大意:给定一个字符串,输出最少需要添加多少个字符使得字符串变成回文串。解题思路:以字符串的转置做KMP,然后用原串匹配即可,最后匹配长度即为重复长度。#include #include #include using namespace std;const int maxn = 1e5+5;原创 2014-09-01 22:20:09 · 1927 阅读 · 0 评论 -
uva 12206 - Stammering Aliens(哈希)
题目链接:uva 12206 - Stammering Aliens题目大意:给出一个字符串,找出至少出现m次的最长子串。解题思路:哈希算法,将每个后缀数组建立一个哈希值,每次二分长度判断,每次判断时将哈希值排序,计数即可。#include #include #include using namespace std;typedef unsigned long lon原创 2014-09-01 21:56:23 · 1334 阅读 · 1 评论 -
uva 475 - Wild Thing(字符串处理)
题目链接:uva 475 - Wild Thing题目大意:给定一个字符串的通配,然后给定一些字符集,问说有哪些字符满足匹配,如果没有一个字符串匹配的话,当前这组数据就任何东西也不输出,包括换行。解题思路:递归去匹配即可,注意∗,∗∗∗这种数据。#include #include #include using namespace std;const int maxn =原创 2014-09-02 19:41:00 · 977 阅读 · 0 评论 -
uva 261 - The Window Property(后缀数组)
题目链接:uva 261 - The Window Property题目大意:给定给一个字符串,枚举子串长度k(len≥k≥1),要求在任意k时,有不超过k+1个不同的子串,如果有的话则输出NO,并且输出最早发现不满足的位置。解题思路:后缀数组,处理出height数组,对于每个k,遍历height数组,碰到小于k的则分段,将整个height分成若干段,即为有多少种长度为k的不同前缀原创 2014-09-02 22:26:32 · 1006 阅读 · 0 评论 -
uva 282 - Rename(字符串)
题目链接:uva 282 - Rename题目大意:给定一个命令行的重命名命令,最多包含一个‘*’,然后给定一些文件名,将该命令转换成若干个执行命令。解题思路:因为最多一个‘*’,所以直接开头结尾匹配掉,再处理中间的即可。#include #include #include #include #include #include using namespace st原创 2014-09-02 19:46:41 · 1115 阅读 · 0 评论 -
uva 11922 - Permutation Transformer(伸展树)
题目链接:uva 11922 - Permutation Transformer题目大意:给定一个序列,每次操作取出区间a~b,翻转后放到末尾,随后输出序列。解题思路:就是伸展树,对于每个节点设一个flip,表示是否为翻转转态。每次将a旋转到根,然后分裂,再将b翻转到根,分裂,然后将mid翻转放到最后。#include #include #include using n原创 2014-09-15 20:00:35 · 1566 阅读 · 0 评论 -
uva 1428 - Ping pong(树状数组)
题目链接:uva 1428 - Ping pong题目大意:一条大街上住着n个乒乓球爱好者,经常组织比赛。每个人都有一个不同的能力值,每场比赛需要3个人,裁判要住在两个选手之间,并且能力值也要在选手之间,问说最多能举行多少场比赛。解题思路:预处理出bi和ci分别表示说在1~i中能力值比第i个人小的人和i+1~n中能力值比第i个人小的。处理过程用树状数组维护即可。#include原创 2014-08-24 23:28:12 · 1455 阅读 · 0 评论