- 博客(15)
- 收藏
- 关注
原创 字符串总结
hash; kmp: 单模式串匹配 trie字典树: trie树是一棵树不光可以求lca dfs序 ac自动机: 多模式串匹配 复杂度n*字符集 1.一堆模式串 一个目标串 问模式串在目标串中出现了多少次 基本应用 2.ac/kmp辅助转移dp 3.fail树: noi2011阿狸的打字机:题目要求是求有多少个y上的fail指针指向x的end节点 显然暴力的做法是将从root
2016-04-18 22:01:18 709
原创 网络流总结
基本模板: 1.最大流 2.最小割 3.费用流 4.上下界网络流 无源汇的上下界可行流 无源汇的最小费用上下界可行流 有源汇的上下界最大流:t向s连一条inf,求一个可行流,ans+=t向s这条边的实际流量,然后删去这条边,再跑一个s到t的最大流,ans+=这个最大流。 有源汇的上下界最小流:t向s连一条inf,求一个可行流,ans+=t向s这条边的实际流量,然后删去这条边,再跑一个
2016-04-10 22:42:25 459
原创 【bzoj3124】: [Sdoi2013]直径
这个题做法比较多 我的做法比较锻(傻)炼(比)代(超)码(级)能(麻)力(烦)。。 对于每个点维护mx cmx f g分别表示最长链 次长链和最长链的方案数 次长链的方案数 先dfs一遍把以每个点为根的子树的这些值都维护出来 然后考虑换根之后 这些值该如何维护 漫长的分类讨论..(看代码) 感觉代码或许有bug 但是这题数据太水了 过了样例1A了。。如果发现哪里不对欢迎指正!!#includ
2016-04-08 20:20:00 547
原创 【BZOJ 3037】 创世纪 树形DP
树的最小支配集:从v中取尽量少的点组成一个集合,使得对于v中剩余的点都与取出来的点有边相连。 怎么求? 如果是正常的树(无向)的话对于每个节点就是三种状态: 0.这个点被选 1.这个点被父亲节点覆盖 2.这个点被儿子节点覆盖 的最小支配集。 对于这道题呢,建反图后变成外向基环树林,所以对于状态就少了一维(没有状态2),还要在环上随便找一个点将环拆开,然后在枚举这个点选不选,若这个点为x
2016-04-08 10:48:55 671
原创 【bzoj2946】[Poi2000]公共串
注意这个!! 一个字符串能到达一个节点的儿子意味着一定含有这个儿子的父亲表示的状态 但是有些点的值并没有赋过 并且每个点都取了min(len【i】)所以保证了从儿子穿上来的信息一定是正确的 for(int i=cnt;i>=1;i–)mx[fa[q[i]]]=max(mx[fa[q[i]]],mx[q[i]]); #include<iostream>#include<cstdio>#inc
2016-03-01 21:36:07 393
原创 【bzoj3998】[TJOI2015]弦论
建出后缀自动机后统计从每个点开始有多少子串 相当于在后缀自动机上统计路径条数 对于T=0时 right集合的大小为1 对于T=1时 right集合的大小需要统计 拓扑排序就行了 看黄学长博客学到了一个机智的拓扑排序的方法 在后缀自动机上len更大的点拓扑序一定在后面 编号更大的点拓扑序可能在后面 所以就可以这么写啦~ for(int i=1;i<=cnt;i++)v[len[i]]++;
2016-03-01 10:19:18 456
原创 【bzoj3926】[Zjoi2015]诸神眷顾的幻想乡
哼要先给那些根本没写清楚还发表的题解差评0.0如果不是clj的题解根本看不懂好嘛0.0 题意求一棵树上本质不同的子串的数量 每个点出度<=20 叶子节点<=20。 从所有的叶子节点开始到根的每条路径的每一个前缀都对应一个子串(公共路径上会重复) 后缀自动机上可以识别全部的后缀 也就是说按照从叶子节点到根的顺序插进去就相当于统计了所有的前缀 于是就想到了后缀自动机~ 后缀自动机不同的状态一定对
2016-02-29 20:22:17 1218
原创 【bzoj1604】: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
先是曼哈顿距离的变换 一维排序 另一维用splay维护前驱和后继 判断一下距离是否小于c 如果小于并查集并起来 就行了#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<map>using namespace std;const int N=210011;const int i
2016-02-26 22:07:33 618
原创 【bzoj3173】: [Tjoi2013]最长上升子序列
ms是个简单的splay+nlogn的最长上升子序列。。? 但是我老是搞不清顺序怎么办0.0 根据题目加入的顺序发现的性质要注意阿0.0 orzorzlyh#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int N=200011;const
2016-02-25 10:28:22 735
原创 【bzoj2599】: [IOI2011]Race
sb的我一开始想统计每棵子树中经过根的路径有多少条应该比较容易 就把休息站选成根就行了。。 你会发现其实这样的话在每棵子树中到根不满足条件的点对完全没有统计 所以在每棵子树x中我们用f【i】表示以x为根的点0减1的个数为i的点的数量 统计答案时ans=f【i】*f【-i】即可 但是这样就没有考虑休息站的问题 于是我们再开一个数组c【dist】表示到当前点为止 dist出现的次数 dist=0
2016-02-24 14:41:20 602
原创 【bzoj1030】[JSOI2007]文本生成器
dp+ac自动机 f[N][N*60]表示长度为i串的在第j个节点没有经过任何一个end节点的方案数 实际上ac自动机上的每一个出边都构成了转移 并且我们想要快速的判断现在的状态有没有包括原来的子串 于是就想到了ac自动机。。 ac自动机十分需要注意的地方:如果拜访过这个节点 那么他的fail指针指向的节点一定被拜访过 还有要注意正着dp比较麻烦 补集转化很机智#include<que
2016-01-23 21:54:08 700
原创 【bzoj1221】[HNOI2001] 软件开发
这个题一定要说点什么。。 这种错误的方法已经犯过两次了: s->i i->i’流量为每日需求量 i’再去连其他可以通过消毒用的天数 这样的拆点有卵用嘛。。 拆点的意义在于新建一个点使得购买的毛巾不消失 而是重新利用 因为每天都会有x的脏毛巾产生 所以每天可以拿去消毒的毛巾就有x 并且最需要注意的是这里毛巾是只要用过随时都可以消毒的 所以i’要往i’+1连边#include<iostream>
2016-01-03 11:18:39 522
原创 【bzoj3171】[Tjoi2013]循环格
满足条件的情况必然是每个点的出度=入度=1 所以用流量守恒来限制相等 用最小费用来决策最优改动 到此为止几乎就是拆一下点的裸费用流 然而到此还真是不容易呢。。#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<cmath>using namespa
2016-01-02 20:17:42 456
原创 【bzoj1433】[ZJOI2009]假期的宿舍
题水然而还是有容易错的地方 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { int x; scanf("%d",&x); if(x==1)add(i,j+n,1);//突然意识到这个问题 if(i==j)add(i,j+n,1)
2016-01-02 19:28:21 498
原创 【bzoj1391】order
这个题还是很机智的。。 最大权闭合子图是怎样通过最小割来限制的 再此基础上稍微变一变。。 但是直接交上去会T 需要用当前弧优化 当前弧优化就是在dfs的时候将流量已经不能再增加的边标记出来 下次dfs的时候直接跳过这些边#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue
2016-01-01 17:37:02 634 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人