摘要: 比较好的 AC自动机算法详解..【转】http://www.cppblog.com/mythit/archive/2009/04/21/80633.html个人总结:【图是盗用的..】ac自动机是用来求出:给出n个单词,和一篇文章arr[],问arr中出现了多少个单词..第一步:根据给出的n个单词构造一棵字典树第二步:根据字典树完成失配指针第三步:枚举文章中的每个字符,并根据拥有了失配指针的字典树 查找 出现的单词个数以单词:saysheshrheher 文章:yasherhs 举例:第一步:根据给出的n个单词构造一棵字典树 1 const int kind = 26; 2 struct n. 阅读全文
posted @ 2014-03-20 16:25 Griselda. 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 题意:给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形..问最多可以拿走多少个正方形..思路: 先找出可以组成正方形的地雷组合cnt个.. 然后st = 1 7 #include 8 #include 9 using namespace std;10 11 struct Point12 {13 int x;14 int y;15 }p[30];16 17 struct Set18 {19 Point p[4];20 int sta;21 }s[200];22 23 int cnt, tmp;24 int ... 阅读全文
posted @ 2013-12-12 14:13 Griselda. 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出老虎的起始点、方向和驴的起始点、方向.. 规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转.. 当转了一次还没路走就会停下来.. 问他们有没有可能在某一格相遇..思路: 模拟,深搜.. 用类似时间戳的东西给方格标记上,表示某一秒正好走到该方格.. 最后遍历一下驴在某一格方格标记时间是否和老虎在该格标记的时间一样,一样代表正好做过这里了.. 还有一种情况就是老虎或驴一直停在那里,那就算不相等,也是可以的..Tips: 我一直忘了老虎或驴停下来的情况,这样只要该方格正好是时间戳最后一秒,而且另一个动物走过的时间比停下来那一个动物的最后一... 阅读全文
posted @ 2013-12-12 14:01 Griselda. 阅读(430) 评论(0) 推荐(0) 编辑
摘要: 题意: 在给出的区间内求出最大买进卖出的差价。思路: 对于弱数据:维护一个从左到右的最大差价和最小值。即当发现当前值比最小值小的时候更新最小值,否则看一下当前值与之前最小值的差价是否比最大差价大,是就更新最大差价。时间复杂度是O(m*n) 对于强数据:利用线段树维护一个最大差价、最大值和最小值,查询的时候求出询问的范围内左右子树的最大差价,然后再利用RMQ求出[l, mid]的最小值和[mid+1, r]的最大值,然后返回max(df[rt 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int... 阅读全文
posted @ 2013-11-20 15:21 Griselda. 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数。 求出这个数列中所有mex的值。 思路: 可以看出对于一个数列,mex(r, r~l)是一个递增序列 mex(0, 0~n-1)是很好求的,只需要遍历找出第一个没有出现的最小非负整数就好了。这里有一个小技巧:1 tmp = 0;2 for (int i = 1; i = 1; --i) {2 if (mp.find(arr[i]) == mp.end()) next[i] = n+1;3 else next[i] = ... 阅读全文
posted @ 2013-11-20 14:54 Griselda. 阅读(622) 评论(0) 推荐(0) 编辑
摘要: 题目: 曹操在长江上建立了一些点,点之间有一些边连着。如果这些点构成的无向图变成了连通图,那么曹操就无敌了。刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥。但是诸葛亮把所有炸弹都带走了,只留下一枚给刘备。所以刘备只能炸一条桥。 题目给出n,m。表示有n个点,m条桥。 接下来的m行每行给出a,b,c,表示a点和b点之间有一条桥,而且曹操派了c个人去守卫这条桥。 现在问刘备最少派多少人去炸桥。 如果无法使曹操的点成为多个连通图,则输出-1. 思路: 就是用tarjan算法算出桥的数量,再比较哪一个的值最小。Tips: 注意三点: ①. 有重边,所以tarjan算法要处理重边... 阅读全文
posted @ 2013-11-20 13:40 Griselda. 阅读(1782) 评论(0) 推荐(0) 编辑
摘要: 题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。 题目给出a,b,求出0~b有多少个不大于f(a)的数。思路: 数位DP,用来学习数位DP了。 所谓数位DP就是基于考虑数字的每一位来转移的DP。 例如求比456小的数,可以这么考虑, 4 5 6 4 5 (0~6) 4 (0~4) (0~9) (0~3)(0~9) (0~9) ... 阅读全文
posted @ 2013-11-20 12:47 Griselda. 阅读(2392) 评论(0) 推荐(1) 编辑
摘要: 初学资料:1:一个介绍VIM操作的游戏,十分适合初学者。只是:不要怕英文。vim-adventures.com2:http://blog.csdn.net/niushuai666/article/details/72754063:http://xbeta.info/vim-tutorials.htm4:大量学习资源集合http://blog.jobbole.com/10250/5:!!超棒http://www.cnblogs.com/wangkangluo1/category/303132.htmlVim的配置文件一些解释~1:http://blog.csdn.net/dinosoft/art 阅读全文
posted @ 2013-10-08 16:04 Griselda. 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个2*n的方格,当刷完某一个方格的漆后可以且只可以走到相邻的任何一格,即上 下 左 右 左上 左下 右上 右下。可以从任意一个格子开始刷墙,问有多少种刷法,因为随着n的增大方案数会变多,因此输出方案数mod 1000000007.思路: dp[][2], dp[i][0]表示2*i的格子从第i列开始刷,最后回到该格子下面 dp[i][1]表示2*i的格子从第i列开始刷,最后无法回到该格子下面 状态转移方程是:dp[i][0] = 2*dp[i-1][0] 即 A1->B1->...->B2->A2, A1->B2->...->B1-> 阅读全文
posted @ 2013-08-11 14:05 Griselda. 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和。 输入 iCase n 表示iCase个样例n个工厂 m1 p1 b1 p2 b2..pm1 bm1 //第一个工厂有m1个同种类不同参数的产品,每一个产品的参数分别是p1 b1 p2 b2 m2 p1 b1 p2 b2..pm2 bm2 ... mn p1 b1 p2 b2..pmn bmn 思路: 排序,先把b从小到大排序,然后把p从小到大排序,最后让第几个工厂的序号从小到大排序 排完后就可以直接... 阅读全文
posted @ 2013-08-11 14:05 Griselda. 阅读(398) 评论(0) 推荐(0) 编辑