摘要: hdu 4758题意:求长度为n+m,有n个0,且必须包含串s1和s2的串的个数,s1和s2可以重叠;太久没写AC了,导致比赛的时候很裸的AC自动机的题目都没有往那边想,唉~比赛的时候就想到状态dp[i][4],但是发现在某一时候在末尾加入s1后会把s2也引入,就是状态转移想不清楚;然后就没有然后了;AC自动机,通过建AC自动机,得出在任何一个状态下s1,s2出现的情况记录在val[]里,这样用dp[len][i][n][state]状态(表示长度为len的串,最后一个字符在AC自动机里的结点I位,0的个数为n,s1,s2的出现情况的个数)就可以DP了; 1 #include 2 #inc.. 阅读全文
posted @ 2013-09-22 02:40 Rabbit_hair 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个图,判断每条边是否在最小生成树MST上,不在输出none,如果在所有MST上就输出any,在某些MST上输出at least one;分析:首先必须知道在最小生成树上的边的权值一定是等于任意最小生成树上的某条边的权值;那么我们按边的权值排序,每次同时加入权值相等的边如果加入这条边之后形成loop那么这条边肯定不是最小生成树上的边,因为在此次加边之前,图上边的权值肯定是小于此次加入的边的权值的,如果加入这条边之后形成环,那么肯定不是MST上的边;加完边之后,如果这条边是bridge,那么这条边肯定是any,因为这条边是连接两个连通块的最小唯一边,如果边在剩下的边肯定在某些MST上; 阅读全文
posted @ 2013-08-24 01:24 Rabbit_hair 阅读(288) 评论(0) 推荐(0) 编辑
摘要: CF#196Bhttp://codeforces.com/contest/338/problem/B题意:在一颗树上,给m个点,求到所有m个点距离不超过d的点的个数,所有路径长度为1。分析:问题转化,就是求一个点是否到离它最远的给定点的距离小于d,先第一遍dfs1求出以当前节点u为根的子树到子树中离它最远的给定点的距离d1[u],和次远的距离d2[u],并且记录下最远距离是从哪个son转移过来的,fo[u];第二遍dfs2求出当前节点从它fa出发能碰到给定点的最远距离up[u],那么对于当前点u,max(d1[u],up[u]),就是u到所有给定点的最远的距离;up[]的可以按照dfs的顺序递 阅读全文
posted @ 2013-08-18 00:16 Rabbit_hair 阅读(966) 评论(0) 推荐(0) 编辑
摘要: hdu 4666题意:n个事件,op == 0 插入一个点,op == 1删除一个点,每个事件之后询问当前点里曼哈顿距离最大的值;分析:曼哈顿距离等于abs(a.x - b.x) + abs(a.y - b.y);就是c1*(a.x- b.x) + c2*(a.y - b.y),c1,c2取1或-1;显然只有当c1,c2去恰当值后值才是他们的曼哈顿距离,并且是最大的;这样我们就有思路了,开1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 u 阅读全文
posted @ 2013-08-13 22:38 Rabbit_hair 阅读(292) 评论(0) 推荐(0) 编辑
摘要: hdu 4576题意:在一个环里从起点随机走c步,一共走m次,问最后站在l~r的概率是多少?分析:常数优化,想不到就作死。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #define lson l,m,rt pii;17 typedef long long LL;18 int n,m,l,r;19 double dp[2][N];20 int c[1000000+10],vis[N];21 const double eps = 1e-10 阅读全文
posted @ 2013-08-11 01:05 Rabbit_hair 阅读(268) 评论(0) 推荐(0) 编辑
摘要: hdu 4655题意:给一个序列,每个位置可以涂1~ai种颜色,连续不相同的颜色为一段,对于一个排列,所有的涂色方法产生的段数为S,求最大的S;分析:对于一个排序,所有的段数为n*{a1*a2*...*an} - (相邻两个位置涂相同颜色的个数S);怎么计算相邻两个位置涂相同颜色的个数S?p[i]表示前缀积,即p[i] = a1*a2*..*ai;q[i]表示后缀积,即q[i] = ai*...*an;S =sum( p[i-1]*q[i+2]*min(ai,ai+1) ) (0 2 #include 3 #include 4 #include 5 #include 6 #include 7 阅读全文
posted @ 2013-08-09 10:57 Rabbit_hair 阅读(237) 评论(0) 推荐(0) 编辑
摘要: hdu 4029题意:给你一个字符矩阵,统计不同的子矩阵的个数;分析:枚举子矩阵的宽度w,对于每一个w,将每一行长度可以是w的字符串HASH成一个值,然后用map标记,因为宽确定了,hash完之后,然后如果相等就表示此时长度为w的字串相等,将他们按照每一列排序形成一个字符串,此时如果莫两个长度为x的子串相等就表示此时x*w的子矩阵相同,这样就是统计m个字符串的不同的子串的个数,这个是SA的论文题;n^3*lognHASH会冲突,SEED选择很重要,当然也可以用2个SEED,这样冲突的概率就很小很小了; 1 #include 2 #include 3 #include 4 #includ... 阅读全文
posted @ 2013-08-07 13:34 Rabbit_hair 阅读(404) 评论(0) 推荐(0) 编辑
摘要: hdu 4632题意:给你一个长度为n的字符串,求包含几个回文序列?分析:dp[i][j]表示区间[l,r]内包含的回文序列的个数,dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]; if (s[i] == s[j] ) dp[i][j] += dp[i+1][j-1]+1;也可以用别的递推方式,比如dp[i][j] = SUM(dp[k][j-1]+1)+1( s[k] == s[j] ,i 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 阅读全文
posted @ 2013-08-02 12:50 Rabbit_hair 阅读(313) 评论(0) 推荐(0) 编辑
摘要: hdu 4629题意:给你n个三角形,问覆盖1~n次的面积各是多少,n 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define pbk push_back 9 using namespace std; 10 const int N = 25050+10; 11 const double eps = 1e-10; 12 inline double sqr(double x){ 13 return x * x; 14 } 15 inline int dcmp(double x)... 阅读全文
posted @ 2013-07-31 14:25 Rabbit_hair 阅读(772) 评论(3) 推荐(0) 编辑
摘要: hdu 4611题意:求累加abs(i%a - i%b)的和,(o 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 const int N = 10000; 9 typedef long long LL;10 int gcd(int a,int b){11 if (b==0) return a;12 else return gcd(b,a%b);13 }14 int a,b,n;15 int main(){16 int T;scanf("%d",&T);1 阅读全文
posted @ 2013-07-25 22:08 Rabbit_hair 阅读(416) 评论(0) 推荐(0) 编辑