摘要: 看原理的话 到这位大哥的博客 深有体会。。http://blog.csdn.net/haha593572013/article/details/8770423如果碰到网格边界的次数大于n+m-2,那么就能够形成一个完整的棋盘。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 using std::queue; 7 using std::min; 8 int const 阅读全文
posted @ 2013-04-08 19:53 诺小J 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 开始用起了后缀数组这种高级的东西,虽然细节方面是勉强看懂了,但是能运用好就行要是有做这套题的朋友实在是不得其解的话,去看看这篇论文吧。。IOI2009 国家集训队论文后缀数组罗穗骞height数组当中存了从第一名到最后一名的公共前缀的长度height 数组:定义height[i]=suffix(sa[i-1])和suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。那么对于j 和k,不妨设rank[j]<rank[k],则有以下性质:suffix(j) 和suffix(k) 的最长公共前缀为height[rank[j]+1],height[rank[j]+2] 阅读全文
posted @ 2013-03-31 15:21 诺小J 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 比赛的时候实在有够憋屈。~一开始就做了F题,以为这道题就是推推公式,也没什么特殊的地方。。。。没想到被double类型的输出%f给吭了。。。先讲一下F题。。现在有总资金S,每年花费X,利润R;R放小1000倍S0=S0;S1=S0-X+(S0-X)*R;S2=S1-X+(S1-X)*R;将S1带入到S2。。S2=(S0-X)*(1+R)^2-(1+R)*X;S3=(S0-X)(1+R)^3-[(1+R)^2+(1+R)]X看上述的公式应该就可以发现规律了。。接下来不推了。。。View Code 1 #include<iostream> 2 #include<cstdio> 阅读全文
posted @ 2013-03-12 13:01 诺小J 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 题意:现在有n辆bus,然后有m个乘客。每辆bus有自己相应的开车路段,与开车时间。s,f,t,表示开车的起始站,终点站,开车时间。l,r,b分别表示乘客想要从l到达r站,然后乘客开始等车时间为b。那么就可以猜想到这个乘客要搭乘这辆车,需要满足一下条件s<l,r<f,t>b,那么此时我们按照起始点排序把所有的路段都包含进来,按照时间点来建立线段树,然后从单点更新,剩下的自己来看一下吧。。。View Code 1 #include<iostream> 2 #include<stdlib.h> 3 #include<algorithm> 4 # 阅读全文
posted @ 2013-03-07 20:55 诺小J 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个国家当中,给你一个词汇书,你可以用里面所有的字母拼凑出一个单词来,但是在这个国家当中存在一些禁用的单词,那么现在问你在不违反规则的情况下,你能尽可能的多拼凑出相应的单词来。那么也就是说拼凑的单词当中不能够出现禁用的单词的字段。后面看到网上教程当中的dp状态转移,傻眼了。。这都可以。dp[i+1][cnt]=dp[i+1][cnt]+dp[i][j],我所理解的就是在i+1这个位置上面我放上cnt这个字符,将之前可行的数目累加到长度为i+1的基础上,其实我认为这个与其说是dp,倒不如说是一种递推。而其中的ac自动机就是用来判断其中新拼凑的单词当中是否出现过类似的字串,出现了就不能够累 阅读全文
posted @ 2013-03-07 20:33 诺小J 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 之前虽然两过一段时间的dp,但是还是没有接触过这样的模糊匹配的状态转移,所以说状态转移是永远都学不完的东西啊。。。其实之所以能够写出这样一道题,还是看了这位大哥的博客http://www.cnblogs.com/staginner/archive/2012/01/25/2329379.html里面讲得比较全面吧,。。。把通配符的意义改变一下,那么这样状态就能得到很好的记录。引用那位大哥里面的话,那就是重新定义一下通配符的意义 *:含义不变,至少配一个,多则不限。 ?:只能配一个。 !:可以配一个,也可以什么都不配。 这样我们就得到了一个新旧通配符的转换公式:*->*,?->?!!, 阅读全文
posted @ 2013-03-02 20:20 诺小J 阅读(451) 评论(0) 推荐(0) 编辑
摘要: View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<stdlib.h> 4 #define N 1010 5 struct node 6 { 7 node *next[26]; 8 node *fail; 9 int count,index; 10 node() 11 { 12 count=0,index=0,fail=NULL; 13 for(int i=0;i<26;i++)next[i... 阅读全文
posted @ 2013-03-02 12:47 诺小J 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给你一些单词,给你一篇文章,需要你求出其中文章中包含了多少个单词?例如其中的单词she、he、say、shr、her,文章yasherhs。那么首先根据单词建立出相应的字典树。和字典树不同的就是AC自动机要建立失败指针,实意就是为了让文章能够一次性的匹配下去。使得某些单词的后缀能够成为某些单词的前缀,使得模式串匹配的时候不至于浪费掉了之前所匹配的次数。匹配之后的指针走向: View Code 1 #include<cstdio> 2 #include<cstring> 3 #define N 1000010 4 char str[N]; 5 struct no 阅读全文
posted @ 2013-03-01 12:47 诺小J 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 只要明白下区间如何更新上区间就可以了,左区间和右区间中只能、可能是右区间右边界中有'w',然后右区间左边界有'b''w',或者是右区间左边界有'w',左区间右边界有'w''b',满足这个情况下面,才可能上面的区间wbw组合增多。所以只要明白这个就ok了。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 const int N = 50005; 5 int cover[N& 阅读全文
posted @ 2012-11-25 12:18 诺小J 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 既然这道题目要我们维护出现在%5=3位置上面的值,那么我现在想想是不是这个线段区间上面只可能有5种状态的线段树出现。那么我就只用维护这五种状态,最后只用看3状态上面的数字之和为多少就ok了。。当然还是要来一个离线处理,因为你现在必须知道对于这一整组数据而言要建立多大的一颗线段树。View Code 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<string.h> 5 #define LL __int64 6 using std::unique; 7 阅读全文
posted @ 2012-11-24 19:21 诺小J 阅读(235) 评论(0) 推荐(0) 编辑