自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

gemini小窝

只是有点懒......

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

原创 hdu 4607 Park Visit (树的直径)

题意:给你一棵树(n点),再给你一个k,问想访问k个点最少要走多少边思路:树的直径d可用两次bfs或者dfs求。若kd,则结果为(d-1)+(k-d)*2,即在走树的直径的过程中走一些旁边的树中的边。#include#include#include#includeusing namespace std;const int maxn=100011;int T,

2013-08-06 22:09:35 548

原创 spoj 694 & spoj 705 Distinct Substrings (不同字串的个数 后缀数组)

题意:给定一个字符串,求不相同子串的个数思路:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), …… ,suffix(sa[n])的顺序计算,不难发现,对于每一次新加进来的后缀suffix(sa[k]),它将产生n-sa[k]+1 个新的前缀。但是其中有he

2013-08-06 21:33:20 716

原创 poj 3261 Milk Patterns (后缀数组 至少出现k次的可重叠最长重复子串)

题意:求至少出现k次的可重叠最长重复子串思路:先二分答案,然后将后缀分成若干组。判断有没有一个组的后缀个数不小于k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。#include#include#include#includeusing namespace std;const int maxn=1000011;co

2013-08-06 21:28:35 575

原创 poj 1743 Musical Theme (后缀数组 不可重叠最长重复子串)

题意:给你一串数,让你求不可重叠的最长重复子串。注意,这里只要差值序列相同即视作重复序列。当最长序列长度小于5时输出0思路:后缀数组求不可重叠的最长重复子串。二分答案,把题目变成判定性问题:判断是否存在两个长度为k 的子串是相同的,且不重叠。解决这个问题的关键是利用height 数组。把排序后的后缀分成若干组,其中每组的后缀之间的height 值都不小于k。有希望成为最长公共前缀不小于k 的两

2013-08-06 21:25:15 720

原创 hdu 4606 Occupy Cities (计算几何+最短路+有向图最小路径覆盖)

题意:在平面坐标系上,给你n个城市点,m条障碍(两断点坐标确定的线段),现有p个士兵(士兵可从任意点开始分布在图中),士兵不可以穿越障碍(但可以从它端点经过),每个士兵有一个等容量的背包,背包可以支撑的的路程就是背包容量,到城市可以全部补给,一个城市补给一个士兵后就不能再次补给了。现在问背包容量最少可以设置为多少。占领城市的顺序是给定的。思路:先预处理出城市到城市的距离,floyd就可以。要让

2013-08-05 13:15:16 929

原创 hdu 4638 Group (树状数组+离线)

题意:给你一串数,然后对于每次询问l和r,问你在[l,r]中有多少段连续的数思路:树状数组,离线。每向后添加一个i位置的数a[i],先直接在这个位置+1,表示出现一个新组,然后看前面是否出现a[i]-1和a[i]+1,若出现a[i]-1,则在pos[a[i]-1]位置-1,a[i]+1同理。因为此时数段被合并起来了,a[i]就代表了它们的状态。将所有的询问按r从小到大排序。然后枚举i,树状数组

2013-08-03 19:57:06 540

原创 树状数组

入门篇:http://fqq11679.blog.hexun.com/21722866_d.html  hdu1166 敌兵布阵 http://acm.hdu.edu.cn/showproblem.php?pid=1166 最基本的模板题,单点更新,区间求和。#include#include #include#includeusing namespace

2013-08-03 18:53:32 340

原创 hdu 4642 Fliping gameFliping game (博弈论)

题意:一个棋盘上每个格子摆放一个硬币,硬币有正面1和反面0之分。现在两个人可以按照规则翻硬币,选择(x,y),要求(x,y)的硬币必须是正面,那么从(x,y)向右下角所有的硬币都被翻转。知道某个人无法翻(所有硬币都是反面)为止,这个人判输思路:考虑最右下角的硬币,每次必被翻转#include#include#includeusing namespace std;int

2013-08-02 19:59:22 759

原创 hdu 4639 Hehe (dp)

题意:给你一个字符串,其中"hehe"字段可以被替换,问这个字符串可以有多少种形态思路:dp[i]表示到i位置,字符串可以有多少种形态。dp[i]=dp[i-1],若i和之前的3个字符恰好构成"hehe" ,则dp[i]要再加上dp[i-4]。#include#include#includeusing namespace std;const int maxn=11111

2013-08-02 19:53:24 650

原创 hdu 4635 Strongly connected (tarjan强连通分量)

题意:给你一个有向图,问在保证这个图无重边,无自环,且不是强连通图的情况下,最多可以添加多少条有相边思路:分析可知,最终得到的图分为A,B两个部分,两部分各自为完全图,A中每个点都向B中每个点引一条有相边,B中每个点必定不存在通往A的有相边。这样可推得整个图的总边数为a*(a-1)+b*(b-1)+ab,需要添加的边数是a*(a-1)+b*(b-1)+ab-m。而a+b=n,化简得a*(a-1

2013-08-02 19:45:59 606

原创 hdu 4632 Palindrome subsequence (dp)

题意:给你一个字符串,问有多少个可间断的回文子序列思路:动态规划。dp[i][j]表示从i位置开始,长度为j的字符串有多少个回文子序列。则dp[i][j]=dp[i+1][j-1]+dp[i][j-1]-dp[i+1][j-2],最后减去dp[i+1][j-2]是因为dp[i+1][j-1]和dp[i][j-1]之间存在重复。如果i位置的字符和i+j-1位置的字符相同,那么可以由dp[i+1]

2013-08-02 19:33:54 548

原创 hdu 4602 Partition (递推+二分快速幂)

找规律,可得到n          1          2          3          4          5     .......k =1     1          2          5          12       28   .......   =2     0          1          2           5        12

2013-08-01 20:07:53 544

原创 二分查找单调队列

#includeusing namespace std;int T,n,m,x;int a[1100],b[1100];int find1(int x,int s,int t){ int mid; while(s<t) { mid=(s+t)>>1; if(a[mid]>x) t

2013-08-01 17:53:21 831

原创 hdu 4619 Warm up 2 (二分图最大独立集)

题意:给你一个网格,里面摆放着1*2的牌,牌有横放和竖放之分,位置用(x,y)标记,横放时牌占据(x,y)和(x+1,y)的位置,竖放时牌占据(x,y)和(x,y+1)的位置,横放的牌和竖放的牌可能重叠,同一方向摆放的牌不能重叠。现在你可以拿走一些牌,使得剩余的牌之间没有重叠。现在问你,最多能剩余多少张牌。思路:典型的二分图最大独立集问题。将横牌和竖牌分为左右两个点集,若两张牌有重叠的部分,那

2013-08-01 17:48:43 625

原创 hdu 4604 Deque (二分法求最长单调子序列)

题意:给你一个n个数字的序列(数字可重复)和一个双端队列。按照顺序取出序列中的一个数,你可以进行以下操作:要么抛弃这个数,要么选择双端队列的头或尾把这个数压进队列。要求保证队列中的数是单调不下降的。求这个单调队列最大长度。思路:考虑题目的一个简化版本,使双端队列单调上升。对于序列A和队列Q,找到队列中最早出现的数字Ax,则Ax将Q分成的两个部分分别是原序列中以Ax开始的最长上升和下降序列,答案

2013-08-01 14:03:14 914 1

原创 hdu 4628 Pieces (状态压缩dp)

题意:给你一个字符串,每次可以一次性删去一个间断的回文串,问最少需要多少次能把字符串删完。思路:状态压缩dp#include#include#includeusing namespace std;const int maxn=1<<17;int T,n;string s;int dp[maxn];bool f[maxn];//构造所有回文子串

2013-07-31 18:58:17 644

原创 hdu 4631 Sad Love Story (暴力set+剪枝)

题意:一个平面,每次增加一个点(x[i],y[i]),其坐标根据上一个点算出:(x[i-1] * Ax + Bx ) mod Cx,(y[i-1] * Ay + By ) mod Cy求出现有点集中的最近点对的距离的平方,共n个点( n ,求平方的和。 思路:使用set容器,使加进去之后的序列按x递增排序。minn对距离进行约束,若x的平方差值已经大于minn了就退出。 

2013-07-31 18:53:10 696

原创 hdu 4627 The Unsolvable Problem (数论)

题意:给你一个n(29),让你寻找满这样的a和b:n=a+b且lcm(a,b)最大。输出最大的lcm(a,b)。 思路:由最小公倍数最大可知,a和b应尽量接近。当n=2*k+1时,易知a=k,b=k+1,因相邻的两个整数必定互质,它们的最小公倍数肯定最大当n=2*k时,显然不能让a=k,b=k,此时最小公倍数就是k了。若k为偶数,令a=k-1,b=k+1,因相邻的奇数互质。

2013-07-31 18:51:54 569

原创 hdu 4600 Harvest Moon (模拟+贪心)

模拟题。给你w*h的格子。a种作物种子,每种种子可以播种至3*3的格子中,可以越界,越界收益无效。若某格子中仍有作物在生长,那么对它播种无效。q_i表示购买第i种作物种子的价格。p_i表示第i种作物成熟之后,卖出每个格子的作物的价钱。n_i表示第i种作物的成熟天数。m_i为成熟周期,如果m_i=0,表示该作物收割一次后就消失,可以再次播种。如果m_i    不为0,

2013-07-31 11:09:25 960

原创 子矩阵

一、最大子矩阵问题考虑这样一个问题,对于一个n*m的01矩阵,找出其中面积(或者周长)最大的全0或者全1子矩阵王知昆在《浅谈用极大化思想解决最大子矩形问题》中给出两种方法。【论文地址】http://wenku.baidu.com/view/0d787294dd88d0d233d46a96.html【例题】hdu1505 http://acm.hdu.edu.cn/showpro

2013-07-02 10:22:47 708

原创 poj 2411 Mondriaan's Dream

题意:将一个n*m的大矩形,用1*2的小矩形填满,问有多少种方案思路:状态压缩dp,状态中,0表示当前位没有被填充,1表示当前位被填充。由于第i层的状态只收到第i-1层状态的影响,故而可以对于第i-1层的每个状态,推导第i层的状态。若i-1层的j位置没有被填充,那么第i层必然要竖着放一个矩形。这样,i-1层状态按位取反后,得到第i层竖着放矩形的情况。横着放的情况逐个搜索。#include

2013-03-11 00:35:10 618 1

原创 hdu 4350 Card

题意:对于52张给出顺序的扑克牌,做n次操作,每次将L~R的牌抽出来放到最前面。询问最后的扑克牌顺序。思路:方法很多,这里用判断循环节的方法。容易看出,对于任意一张牌,在52次操作中,必定会出现位置的重复。这就是循环节。对于r之后的牌,不受操作影响,故而顺序不变。对于r之前的牌,第i张牌经过一次操作,位置会变为(i+(r-l+1))%r。#include#include#inclu

2013-03-11 00:17:43 476

原创 hdu 4308 Saving Princess claire

题意:在迷宫中,王子Y想要到达公主C的位置,迷宫中有障碍#,收费站*,传送点P。对于收费站,输入给出所收费用cost;对于传送点,可以选择传送到任意其他的传送点,或者不传送。要求让路径花费最小,输出最小花费。 思路:最短路径或者BFS。对于传送点P,由于可以任意互相到达,于是可以将所有传送点合为一个点。对于每个点,向四个方向连边,对边加权值cost或者0。构图之后直接SPFA。 #

2013-03-10 19:11:46 626

原创 2012 Multi-University Training Contest 1

慢慢写,慢慢更新~A.Clairewd’s message 模拟~#include#include#includeusing namespace std;map p;char s[200001];int main(){ int T,len,i,j,k; scanf("%d",&T); while(T--) { scanf("%s"

2013-01-30 22:20:03 453

原创 poj3450 Corporate Identity

题意:给你若干个字符串,求它们的最长公共子串。对于相同长度的最长公共子串,取字典序最小的那个。思路:枚举第一个字符串的所有可能子串,对后面所有字符串进行匹配。#include#include#includeusing namespace std;const int maxn=1001;bool kmp(string a,string b){ int i,

2012-12-09 23:38:41 347

原创 poj2185 kmp经典好题!

题意:先对于一个n*m的字符矩阵S,求一个S中最小的矩阵t,使得这个矩阵可以通过复制,组成一个大矩阵T,T可以完全覆盖S。注意,这里S和T不必要相等,只要T中和S重合的那部分完全等于S即可。思路:网上通行的题解方案其实是不可取的,能AC.....只能说数据比较弱。这道题很多题解说求每行最小重复子串长度的最小公倍数,每列最小重复子串长度的最小公倍数。其实这是很容易看出反例的。因为并不要求矩阵T和

2012-12-04 15:01:33 597

原创 poj1961 kmp 重复串

题目:一个字符串,对它的所有前缀S1,判断S1是否是由若干S1的子串重复组合而成的,若是,则输出S1长度,重复次数思路:同此题,http://blog.csdn.net/my_gemini_acm/article/details/8247729。注意这里子串重复数必须大于1。 #include#includeusing namespace std;const int m

2012-12-02 13:48:14 462

原创 string常用操作(更新)

string的倒置(1)#include str.assign(str.rbegin(),str.rend());(2)#include reverse(str.begin(),str.end()); string的子串string substr(int pos = 0,int n ) const; //返回pos开始的n个字符组成的字符串

2012-12-02 13:13:36 342

原创 poj1226 kmp 最长公共子串

题目:对于字符串A1,A2,...,An  ,求一个最大子串长度,使得它或者它的逆向串在每个串中出现思路:对于A1串,寻找每一个子串,与之后n-1个串匹配。子串长度的选取可以优化。 #include#include#includeusing namespace std;const int maxn=101;bool kmp(string a,string b

2012-12-02 13:00:22 498

转载 kmp算法详解 by huangchao

http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/写得非常详细,和matrix67的一起看效果非常好 主要看了这里,感觉讲的十分的不错,总结一下。首先声明要搜索的串为S,设长度为n,要匹配的串为M,设长度为m.先考虑暴力的算法,暴力的算法是遍历S的每一个字符,然后从这个字

2012-12-02 12:04:09 783 1

原创 poj2406 kmp 最小重复子串

这个题就是利用kmp的next函数,求组成主串的最小重复子串的长度。如果字符串下标从1开始的话,字符串长度len(1)若len mod ( len - next[len] ) = 0 那么a[next[len]+1...len] 就是最小重复的子串(2)若len mod ( len - next[len] ) !=0 那么最小重复子串为字符串本身 #include#incl

2012-12-02 00:51:41 1486

原创 poj3461 kmp 模板题

KMP模板题输入字符串A和字符串B,求字符串A在字符串B中出现的次数#include#include#includeusing namespace std;const int maxn=1000011;int tot;void kmp(string a,string b){ int i,j; int p[maxn]; j=-1; me

2012-12-02 00:02:21 534

原创 kmp算法模板

#include#include#includeusing namespace std;const int maxn=10011;int tot;int ans[101];void kmp(string a,string b){ int i,j; int fail[maxn]; //这里的fail就是常说的next j

2012-12-01 23:26:29 456

转载 kmp算法详解 by matrix67

如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你

2012-12-01 23:17:38 557

空空如也

空空如也

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

TA关注的人

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