自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

长颜草的博客

人总要有野心,有梦想,然后光芒万丈……

  • 博客(41)
  • 收藏
  • 关注

原创 AC自动机详解

概述介绍Aho-Corasickautomation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。要学会AC自动机,我们必须知道字典树,也就是Trie树,又称单词查找树或键树,是一种树形结构,是哈希树的变种。AC自动机一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie和KMP模式匹配算法的基础知识。K

2017-08-21 19:48:56 2143

原创 字典树详解

字典树字典树又称为单词查找树,Trie树,是一种树形结构,是哈希树的一种变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。如图所示: 性质1、根节点不包含字符,除根节点外的每个节点都只包含一个字符;2、从根节点到某一节点,路径上经过的字符连

2017-08-04 09:30:06 2694

原创 HDU 2222 Keywords Search【AC自动机】

题目链接题目意思给你几个字符串,接着给你一个文本串,问你文本串中有几个前边所给的字符串。解题思路这就是一道简单的AC自动机的模板题,并没有什么难点。代码部分#include <iostream>#include <stdio.h>#include <stdlib.h>#include <queue>using namespace std;const int allson=26;char

2017-08-26 20:04:16 191

原创 HDU 6168 Numbers

题目链接题目意思给你两个序列A,B,序列B中的数是A中任意两个数的和。现在给出你A,B序列混在一起的数,让你找出A序列输出。解题思路B序列中的数是A中任意两个数的和,那么给定的序列中最小的两个数一定是A序列中的,最大的两个数一定是B序列中的,现在就根据A中的两个数依次找,两数相加的和是B中的,就用map,每次将两数的和在map中除去,剩余的一个加入A中,再一次往后推即可。代码部分#include

2017-08-22 19:30:40 381

原创 HDU 6152 Friend-Graph

题目链接题目描述就是一个团队如果存在三个或者三个以上的人互为朋友的关系,或者都不是朋友的关系,那么就说明这个团队是一个坏团队,否则输出好团队。解题思路暴力大法好,将每个人之间的关系都存于一个w数组之中,注意这里的数组为bool类型,暴力任意三个节点,如果他们之间的关系都为true或者false,则输出 “Bad Team!”,否则输出”Great Team”。与此同时知道了能用bool类型的数组尽

2017-08-19 19:50:19 372

原创 HDU 6153 A Secret

题目链接题目意思给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少。解题思路扩展KMP模板题,将s和t串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最长公共前缀存于数组,最后通过将数组的值不为0的进行一个等差数列和的和就可以了。代码部分#include <iostream>#include <string>#include <string.h

2017-08-19 19:47:12 1199

原创 HDU 6154 CaoHaha's staff

题目链接题目意思给你一个面积,让你求围成这个面积最少需要几条边,其中边的连线只能是在坐标轴上边长为1的的线或者是两个边长为1 的线的对角线。解题思路这其实就是一个找规律的题,我们列举前几个会发现,增加斜边,每增加一条边面积就能增加1.5,然后根据你所列出的边数跟面积的关系去找规律,其中每次能被4整除的数都能形成一个菱形,那是边数确定面积最大的。代码部分#include <bits/stdc++.h

2017-08-19 19:09:32 517

原创 同余定理

数论中的重要概念。给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。同余符号两个整数a、b,若它们除以整数m所得的余数相等,则称a与b对模m同余或a同余于b模m。记作a≡b(mod m)【定义】 设m是大于1的正整数,a、b是整数,如果m|(a-b),则称a与b关于模m同余,记作a≡b(mod m)。

2017-08-19 10:32:53 742

原创 HDU 6140 Hybrid Crystals

题目链接题目链接搞得好像阅读理解,就是给定一个序列。序列的每个值都有属性,N代表可加可减,L代表只能加,D代表只能减,当然这些都可以用或者不用。给定一个k,问k是否可能用这个序列构成。解题思路这道题就是固定左右的区间,不断地扩展,然后判断k是否在这个区间内就可。 感觉这道题就是阅读理解,给的式子也没啥用,关键竟然能够水过,根本就没有深究,考虑的不够严谨,竟然还有这种操作,表示很心累。代码部分#i

2017-08-17 20:08:36 438

原创 HDU 6127 Hard challenge

题目链接题目意思平面上有(n)个点,已知每个点的坐标为((x,y)),以及该点的权值为(val),任意两点之间可以连接成一条不经过原点的边,该边的权值是两个端点的权值的乘积。现在要求画一条经过原点的直线,定义这条直线的权值为这条直线穿过的所有线段的值的和,问权值的最大值。解题思路我们将所有的点按照极角排序,分别散落在y轴的左右两侧,y轴左端的点的和为suml,右端的点的和为sumr,则权值和为su

2017-08-17 09:24:00 577

原创 HDU 6129 Just do it

题目链接题目意思给你一个包含n个数的序列A和一个数m,序列B中的数是序列A经过异或得到的,比如:b[i]=a[1]^a[2]^…..^a[i]。现在让你求经过m次异或后,序列B的值。解题思路我们写下其前五项的值可以发现我们设定ans【i】【j】表示进行到第i次,第j个位子的答案的话,ans【i】【j】有推导式:ans【i】【j】=ans【i-1】【j】^ans【i】【j-1】; 从图中我们可以看

2017-08-16 10:49:52 1529 14

原创 HDU 6130 Kolakoski

题目链接题目意思给你一个Kolakosiki 序列1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1……这个序列由1和2组成,相邻的相等的可以划分在一起,1,22,11,2,1,22,1,22,11,2,11,22,1……. 其中第i个模块的长度就是其中的数的个数。如对于上边的序列a[1]=1,a[2]=2,a[3]=2,a[4]=1……现在问你第n个数为什么。解题思路

2017-08-15 19:38:40 1693

原创 HDU 6124 Euler theorem

题目链接题目意思有两个数a,b,计算a mod b。现在忘记了b,只知道a,问你可能的结果有多少种。解题思路这就是一道规律题,我们观察可以发现我们取模的结果要不是正好除尽为0,或者比他大余它本身,还有就是余下的不同个数,但是你会发现不管是什么数,它的结果总是自身的一半加上一或者二。因为奇数的时候要加上它自身的一半那个数和它自身那个数。偶数的时候直接加上它自身就够了。代码部分#include <io

2017-08-15 19:23:57 451

原创 最短路详解

在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径叫作最短路径或者最短距离。对于带权的图,考虑路径上各边的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或带权路径长度。从

2017-08-15 09:49:22 976

原创 HDU 6097 Mindis

题目链接题目意思在圆内有两点P,Q,满足OP=OQ。现在要在圆上找一点D,使得DP+DQ最短。解题思路我们可以分为两种情况来讨论: 1、OP = OQ = r 的情况。这是最短的距离应该就是PQ的连线距离了。 2、OP = OQ < 的情况。这时我们引进一个反演点的知识。反演点:已知圆O的半径为R,从圆心O出发任作一射线,在射线上任取两点M,N。若OM=m,ON=n,且mn=R^2,则称点M,N

2017-08-14 15:55:54 425

原创 HDU 1863 畅通工程【最小生成树】

题目链接题目意思给你n条边和m个城镇,城镇编号为1~m。现在要你求连通所有城镇的最小花费。如果不能连通就输出“?”。解题思路其实这就是一个简单的最小生成树的问题。我们可以用kruskal来写。注意我们要判断能不能形成通路,加一个标记变量。判断能不能形成回路即可。代码部分#include <iostream>#include <stdio.h>#include <string.h>#includ

2017-08-14 09:39:19 268

原创 HDU 1879 继续畅通工程【最小生成树】

题目链接题目意思给你n个城镇,城镇序号从1~n,现在要使这n个城镇相连。每组数据给你两个城镇的编号,和修这条路的成本,还有这条路的状态,0表示没修,1表示修好。现在要你求让城镇相连的最小的修路花费。解题思路其实这就是一个最小生成树的问题。我们找到一棵最小生成树。这里需要注意的是两个城镇之间可能路已经修好,那么我们就要有一个操作就是把已经存在道路的两个城镇之间的花费改为0。具体实现看代码吧!代码部分#

2017-08-14 08:50:43 279

原创 Codeforces Bear and Big Brother

题目链接题目意思现在有两头熊,分别为熊大,熊二。他们的体重分别为a,b,其中a<=b。熊大每年体重增加三倍,熊二每年体重增加两倍。现在问过几年熊大的体重比熊二重。解题思路这就是一道简单的暴力题。我们每次比较增重后的体重是否符合a>b即可。具体过程看代码吧!代码部分#include <iostream>#include <stdio.h>#include <string.h>#include <

2017-08-12 17:07:34 315

原创 Codeforces Counting-out Rhyme

题目链接题目意思有n个人,序号从1~n,第一个人是领导人。现在给你一个k,接下来是k个数,代表k步。每走k步,最后走到的那个人淘汰,他的下一个人成为领导人。现在要你找出依次淘汰的人的序号。解题思路这就是一道简单的暴力题,用vector存储这n个人,然后走,将淘汰的人删除,接着继续走即可。代码部分#include <iostream>#include <stdio.h>#include <stri

2017-08-12 16:59:28 228

原创 STL排序函数

STL提供的Sort算法所有Sort算法介绍所有的sort算法的参数都需要输入一个范围[begin,end)。如果你需要自己定义比较函数,你可以把你定义好的仿函数作为参数传入。每种算法都支持传入比较函数。以下是所有STL_sort算法函数名称: 函数名 功能描述 sort 对给定区间的所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_

2017-08-12 12:30:57 1349 2

原创 HDU 6105 Gameia

题目链接题目意思Bob和Alice玩游戏,要将一颗没有颜色的树进行涂色。Alice先走,图白色,Bob图黑色,并且可以将与它直接相连的点染成黑色,不管这点以前是空白的还是白色的。由于Bob是VIP玩家,可以随时在游戏中切断一条边。解题思路只有当n为偶数且Bob可以根据他的特权将这棵树切成两两相连的时候,才可以获得胜利,否则都是Alice赢。代码部分#include <bits/stdc++.h>u

2017-08-11 11:01:47 350

原创 HDU 6103 Kirinriki

题目链接题目描述给定一个字符串,问最大字串长度为多少的时候交叉相减的绝对值之和小于等于输入的m,注意,子串不能重合。解题思路假设i是左边s1串的头位置,j是右边s2串尾位置,那么状态转移的方程不就是看abs(str[j]-str[i])+ len[i+1][j-1])是否小于等于n(len[i][j]表示这俩个串所能组成最长子串的花费是多少),如果是直接 dp[i][j] = dp[i+1][j-

2017-08-10 20:20:39 889 2

原创 HDU 6106 Classes

题目链接题目描述学校有A,B,C三类课程,N个班的学生选课,每个班给你7个数据,代表选课程A,B,C,AB,BC,AC,ABC,的人数,数据中可能有错误的,但是至少有一个是正确的。现在要你求这N个班中至少选了1门课的最大人数。解题思路首先我们要判断数据是否错误,如果数据错误,那么直接就可以跳过不用计算。否则,我们只需要算出选A,B,C三类课程的人数就可以知道至少选一门课的人数,然后将N个班级的人数进

2017-08-10 19:41:57 483

原创 HDU 6098 Inversion

题目链接题目意思首先先普及一下’a|b’代表a是b的因子,即b%a=0,’a∤b’也就是b%a!=0 给定一个序列,求i从2开始不是i倍数的序列中的最大值,依次输出解题思路暴力大法好,首先用一个结构体数组保存值与下标。然后对值进行从大到小的排序,然后依此对每个下标i找出对i取余不为零的输出。代码部分#include<bits/stdc++.h>typedef long long ll;usin

2017-08-10 19:23:20 205

原创 位运算详解

基本的位运算符有与、或、异或、取反、左移、右移这6中,它们的运算规则如下:注意:在这6种操作符,只有~取反是单目操作符,其它5种都是双目操作符。位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。位操作符的运算优先级比较低,因为尽量使用括号来确保运算顺序,否则很可能会得到莫明其妙的结果。比如要得到像1,3,5,9这些2^i+1的数字。写成int a = 1 << i

2017-08-10 10:40:47 558

原创 HDU 6092 Rikka with Subset

题目意思题目意思给你一个序列A,从A1~An,b[i] 表示元素和为i的集合个数。给你一个数列 b[] ,长度为m+1(m<=10000),让你求 序列A,并按照其字典序最小输出。解题思路设想a子集中肯定会有一个集合为空集,所以b[0],为空集的个数。那么除了空集以外b[i]如果不为零,则i为a集合中最小的值,并想办法将其在b集合中去除。 这里用了dp的思想,从i下表开始之后的动态转移方程 b[i

2017-08-08 20:41:44 218

原创 HDU 6090 Rikka with Graph

题目链接题目意思给你一个包含n个点m条边的无向图,现在要求这个无向图的最小权值。无向图的权值等于每对点经过的边的条数,如果两点之间没有路径,那么权值就等于n。解题思路这是一道思路题,我们很容易找到规律,可以分成三种情况。包含n个顶点的无向图最多有n*(n-1)/2条边。当m大于n*(n-1)/2时,是一种情况,那时我们直接让m等于n*(n-1)/2;此外,当m小于(n-1)时,就会有孤立的点,这是就

2017-08-08 20:07:38 299

原创 HDU 6095 Rikka with Competition

题目链接题目意思给你一组n个数,代表n个选手的能量高低,现在再给你一个k,任意在n个选手中挑取两个选手比赛,如果 |ai−aj|>K那么能量高的选手获胜,另一个将被淘汰,否则两个人都有机会获胜,现在要你求有多少人有获胜的可能。解题思路如果把n个选手的能量值进行排序,那么两两相减,如果大于k,就结束一轮的循环,否则两人都有可能获胜,那么让ans++即可。具体过程看代码吧。代码部分#include <i

2017-08-08 19:43:37 671 1

原创 HDU 6060 RXD and dividing

题目链接题目意思给一棵树T,有n个结点。 给一个k,表示有k个集合,我们需要把2,3,4,…n号节点放入集合,要保证k个集合的并集等于{2,3,4,5n},并且集合互不相交。(集合可以为空) 然后每次取一个集合Si与{1}求并,得到比如{1,2,3},那么tempi = f({1,2,3});f({1}并Si)的意思是把合内的所有点连接起来的边的权值和。最后把所有权值和相加的到答案。 最后问你

2017-08-08 11:00:56 232

原创 HDU 6070 Dirt Ratio

题目链接题目意思给出n个数,求任意区间【left,right】的AC率中最小的那个值。 区间AC率=distinct【left,right】/(right-left+1) distinct的中文意思是唯一的,特殊的,表示区间【left,right】中不同数字的个数解题思路我们求AC率,它无非就是0~1之间的一个数字,因此采用二分答案的方法求解。 现在假设答案为mid,则 distinct【le

2017-08-08 10:31:29 245

原创 邻接链表的构建

这里要讲的邻接链表的构建是在练习ACM中的从常见的存储方式,方便图的存储与构建,并非是数据结构书中的那么复杂,但思想都是相同的。 大家都知道,临界链表的构建有两种,一种是头插法,一种是尾插法。尾插法会更容易理解。所以先讲下较难理解头插法。头插法头插法是用结构体数组来实现的。 具体的思路是:在建立邻接表时,记录的不是点而是边,对于每一个点所对应的邻接表都是以栈的形式存储的,也就是说先添加的边在遍历

2017-08-07 20:38:09 1240

原创 HDU 6058 Kanade's sum

题目链接题目意思给你两个数n,k。接着给你一个包含1~n的序列,让你求这个序列中所有子序列中第k大值的和,当然了序列是不能改变的。解题思路一开始以为是主席树,也是类似求在不改变序列的条件下,求区间的第k大值,然后就是把所有情况都加一遍。 我们只要求出对于一个数x左边最近的k个比他大的和右边最近k个比他大的,扫一下就可以知道有几个区间的k大值是x。我们考虑从小到大枚举x,每次维护一个链表,链表里只有

2017-08-05 16:21:43 273

原创 HDU_6069 Counting Divisors

题目链接题目意思给你三个数L,R,K让你求满足下面公式的答案 解题思路由题意我们可以知道L,R最大为1e12,所以我们可以用筛法筛选sqrt(1e12)之内的所有素数。 有数论中的结论我们知道,任何一个正整数x,都可以分解成若干个素数幂的积。 则 x = (p1^m1)* (p2^m2)* (p3^m3)* …..* (pn^mn); 其中p1,p2,p3…pn都是素数,m1,m2,m3

2017-08-05 11:13:10 266

原创 HDU_6078 Wavel Sequence

题目链接题目意思给你两个序列a,b,让你找出两个函数 f 和 g 使得 a[f]=b[g],并且a[f1],a[f2],a[f3]……a[fk]满足序列a1 < a2 > a3 < a4……为你满足关系的 f 和 g有多少种解题思路用两个二维数组sum和dp来存储b数组中每个数字作为波峰和波谷的两种情况: dp[ ][0]用来表示当前数字为波谷时的情况 dp[ ][1]用来表示当前数字为波峰时的

2017-08-04 16:40:12 250

原创 莫比乌斯反演

莫比乌斯反演莫比乌斯反演是数论数学中很重要的内容,可以用于解决很多组合数学的问题。莫比乌斯函数莫比乌斯函数,数论函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯首先使用μ(n)作为莫比乌斯函数的记号。莫比乌斯函数是指以下的函数:在这里,λ(n)是刘维尔函数莫比乌斯函数是一个数论函数,它同时也是一个积极函数(μ(ab) =μ(a)μ(b), a,b互质 )当n不等于1时,n的所有因子的莫比乌斯函数值的

2017-08-03 20:52:23 752

原创 图论500题

最小生成树 +并查集 【HDU】 1213 How Many Tables   基础并查集★ 1272 小希的迷宫    基础并查集★ 1325&&poj1308 Is It A Tree?    基础并查集★ 1856 More is better    基础并查集★ 1102 Constructing Roads    基础最小生成树★ 1232 畅通工程    基础并查集★ 12

2017-08-03 11:35:07 554

原创 STL之binary_search的用处

STL之binary_search概括大家都知道,二分查找是在排序后的基础上来对其进行查找操作。所以在使用bianry_search的时候,需要将要查找的容器进行排序。说明在这里说明两种,一种是对结构体的二分操作,一种是对数组进行二分操作,在操作之前,肯定是需要对结构体进行排序,如何排序,这里就用到了STL里面很实用的sort函数。特别强调:排序的必须是从小到大vector#include <ios

2017-08-01 20:39:06 1967 2

原创 二分查找详解

二分查找算法概括二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后

2017-08-01 20:36:53 358

原创 矩阵快速幂详解

矩阵快速幂在讲矩阵快速幂之前,先引入整数快速幂的概念。 整数快速幂为了引出矩阵快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂。如果现在要算X^8:则X*X*X*X*X*X*X*X*X 按照寻常思路,一个一个往上边乘,则乘法运算进行7次。用(X*X)*(X*X)*(X*X)*(X*X)这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算则乘法运算执行4次。已经比七次少。所以为了

2017-08-01 20:34:07 2519 4

原创 HDU_【2017 Multi-University Training Contest 2】——1008 To my boyfriend

题目链接代码部分#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=105;int num[maxn][maxn];int n,m;ll cal(int x, int y){ ll res=0; int c=num[x][y],L=1,R=m; for (

2017-08-01 11:55:15 263

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除