摘要:
去年就见到过这个词,不过一直没有去看,不是很理解其中的算法,可能是对kmp还没能够了解透彻。。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。详见:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html(AC自动机算法详解)贴个模板吧:hdu 2222 经典ac自动机# include<stdio.h># include 阅读全文
摘要:
题意: 给n个数,已经按从大到小顺序排列好,一共有q个询问,每次询问一个区间,问这个区间中出现次数最多的数是什么。 题目数据范围: 数的个数,1 <= n <= 100000 询问次数,1 <= q <= 100000 每个数的大小,-100000 <= ai <= 100000 很容易想到建立线段树,并在线段树的每个节点中保存区间中出现次数最多的数 需要解决的问题,两个子结点的信息如何合并到父节点。 很显然,子结点中出现次数最多的数不一定就是父节点中出现次数最多的数, 有可能一个数在两个子结点中的出现次数都不是最多,但是子结点合并成父节点后,这个数的出现次 阅读全文
摘要:
去年省赛的第四题,也算是一道压轴题了,,刚开始没太读懂题意,用了并查集 乱搞。。 最后想想应该是用强连通缩点。其实昨天晚上就已经写好了代码, 不过在南工上交一直 TLE ,很纳闷, 感觉和以往写的强连通差不多啊。。一看再看还是没有找到错误。。 今天和战友们讨论发现有一个地方没有处理好,就是缩点之后的深搜, 对于该商品的最大价值没有处理好。。改过之后索性仍是TLE 。。 后来找到测试数据,,共有 三组测试实例,,但是无论怎么搞都只有两组输出,最后很无语的放下了。。吃过饭后再看下,猛然发现edge开小了, 改过之后 就AC了。。内牛满面。。明明是RE,为啥总是提醒我TLE。。。思路:先用强连通缩点 阅读全文
摘要:
pku1703,并查集的应用,比较常见的一种。刚开始没什么思路,,想到一种方法,就是记录下每一个节点到根节点的距离,根据两个节点的距离之和的奇偶性来判断是敌是友。这个代码没有写,不知道能行不能行。。disscuss发现一种方法:用两个数组,一个存友f[],一个存敌d[]。如果是D a b就把a与的d[b]进行Union,b与d[a] 进行Union,如果是A a b先判断find(a) 是否等于find(b) 是就输入the same。否的话判断find(a)是否等于find(f[b])是的话输出the differentelse 输出 条件不足。代码就不贴了。。1027 和2062是两道模拟 阅读全文
摘要:
和poj的2513差不多,不过没那么麻烦,这个不需要用Trie树。。并查集+欧拉回路。先看成是一个无向图,判断连通性。 之后记录每一个字母的入度和出度。这个也是两种情况:一种:所有点的入度==其出度;另一种:只有两个点的入度不等于它的出度, 并且其中一个点的入度==其出度+1,另一个点的出度==其入度+1;这样就很简单了^_^# include<stdio.h># include<string.h># define MAX 27int father[MAX],indegree[MAX],outdegree[MAX];int find(int x){ while(fath 阅读全文
摘要:
和hdu的3639有点相似,不过最后求的不太一样。。方法还是一样的,我也是用强连通分量+反向图做的。。有一周没写强连通了,,有点手生了,以后要多练习练习。。题目大意:有N头牛 ,如果a 牛喜欢b牛 而 b牛喜欢c牛,那a和b都喜欢c牛。。像那种爱屋及乌。。也就是喜欢是可以传递的,问最后 被除它自己之外的所有牛 都喜欢的牛 的数量。。有那么一点拗口。。。先用强连通缩点,, 之后建立反向图,,从入度为0的开始深搜,,如果该点符合条件的话 就加上该点的权值(即是该点所包含的牛的数量),之后输出即可。。。# include<stdio.h># include<string.h> 阅读全文
摘要:
题目意思:有许多的棍子,每一个棍子的两个端点都标记一种颜色, 端点颜色相同的两个棍子可以连在一起,问最后能不能把所有的棍子连成一条直线。。刚开始题目理解错误,,误以为最后连成一个环,怎样搞都不对,,后来用有道才发现理解错误,,英语差的真的伤不起啊。。。先用Trie树把颜色改为点,并记录每一种颜色出现的次数,再用并查集判断是否连通,,之后用欧拉回路判断能否构成直线。。这里存在两种情况:1-3 , 3-5, 5-1 和 1-3, 3-5, 5-1 , 1-2一种是所有的所有的颜色都出现偶数次,另一种是有两种颜色出现奇数次,, 这样就很简单了。。# include<stdio.h># i 阅读全文
摘要:
hdu 1598 find the most comfortable road分类上属于最短路,,不过用枚举可以水过,, 但是却没想到怎样用最短路来求。。把边的长度排序,每枚举一条边,按顺序添加比枚举边小的边到并查集, 判断起点和重点是否联通,如果是的话 ,另枚举更长的边,取最小值就可以了。。# include<stdio.h># include<string.h># include<stdlib.h># define PI 0xfffffffstruct node{ int p,q,dis;}s[1005];int father[205];int find 阅读全文
摘要:
五一宅了三天 ,还算是有一些收获吧。。没学什么新的算法,但是做了一些题目,,有水的也有稍微不太水的。。几天终于在hdu上刷够了400,,激动下。。。^_^~~~~~做了一些个搜索题目,,1180诡异的楼梯,只因为没看清楚 一点 一致于wa到 无奈。。。题目上说可以在‘.’和‘S’和‘T’处停下。。 我把这个‘.’给忽略了。。今天和星海讨论这道题目才发现我的代码什么地方错了。。回来之后改了下就AC了,泪奔啊。。。还有一道那个胜利大逃亡(续)忘记了是哪一题了,,需要用到一个位运算,记录一种状态。。对于位运算我一直尝试着去学习,不过一直没碰到这样的机会。。明天吧,,明天看看。。。由于钥匙也只有10把 阅读全文
摘要:
判断两条线段是否相交。。先用叉乘判断任一条线段的两个端点是否在另一条线段的两边。。如果一个线段的一个端点在与另一条线段共线,再用点乘判断是否在线段上。。可以做个模板---# include<stdio.h># include<string.h>struct Node{ double x,y;}point1[105],point2[105];double Cross(Node p1,Node p2,Node p3){ return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);}double Point(Node p1,N 阅读全文