上一页 1 2 3 4 5 6 ··· 17 下一页
摘要: DP解之,边界纠结了两个小时,不过还好一次AC,f[i][j]表示已节点已为根的有j个节点所需去掉的边,这个过程可由分组背包的思想来完成,确定最优解每个子树应该有的节点数。最后就是比较i(i为每个节点的编号)为根的保留p个节点的最小值,p为要保留的节点数。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int maxn=150+10; 6 const int inf=0x3f3f3f3f; 7 int f[maxn][ 阅读全文
posted @ 2013-06-07 09:46 LJ_COME!!!!! 阅读(134) 评论(0) 推荐(0)
摘要: 后缀数组,还是对height数据进行分组。然后二分答案。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=20000+10; 7 int num[maxn]; 8 int sa[maxn],t[maxn],t2[maxn],c[maxn],height[maxn],rank[maxn]; 9 map a;10 int n,K;11 void build_sa(int m... 阅读全文
posted @ 2013-06-01 16:11 LJ_COME!!!!! 阅读(121) 评论(0) 推荐(0)
摘要: 若序列ai,ai+1,ai+2,ai+k-1,和aj,aj+1,aj+2,..aj+k-1,满足要求,那ai+1-ai==aj+1-aj,以此类推。所以对原序列进行处理,得到有n-1个元素的序列b,bi代表ai+1-ai的值,那么原问题就转化为了不可重叠最长重复子串。二分结果值k,看是否存在两个长度为k的子串相同,并且不重叠。也就是看是否存在一对后缀,这两个后缀的LCP大于等于k,并且编号差值>=k。把根据height数组分组,得到的每组任意两个后缀的LCP>=k,并且是封闭的,任意一对后缀满足LCP大于等于k的后缀都分别属于这几组,即分了类,然后看每一类中是否至少存在一对。即求出 阅读全文
posted @ 2013-06-01 00:46 LJ_COME!!!!! 阅读(188) 评论(0) 推荐(0)
摘要: AC自动机+矩阵乘法。和多数人一样。也是看了Matrix67的博客。http://www.cnblogs.com/lj030/archive/2013/05/17/3083718.html 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #define LL long long 6 using namespace std; 7 const int maxn=11; 8 const int inf=0x3f3f3f3f; 9 co 阅读全文
posted @ 2013-05-29 20:03 LJ_COME!!!!! 阅读(172) 评论(0) 推荐(0)
摘要: LCA模板题,用的方法是转化为RMQ问题来求解,各种WA,折腾了一整天,哎~~~ 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <map> 6 #include <vector> 7 using namespace std; 8 const int maxn=100000+100; 9 int pos[maxn],se[maxn*2],d[2*maxn][20];10 int e[. 阅读全文
posted @ 2013-05-28 16:37 LJ_COME!!!!! 阅读(124) 评论(0) 推荐(0)
摘要: AC自动机+DP,AC自动机还是把字符串按后缀分类,每个节点记录串的状态为本节点时会包含哪几个所给出的字符串。ans[i][j][k]表示长度为i状态为j包含的所给出的字符串为k(二进制,每一位1,0表示有没有第i个字符串)的字符串的个数。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #define LL long long 6 using namespace std; 7 const int mod=... 阅读全文
posted @ 2013-05-27 21:50 LJ_COME!!!!! 阅读(139) 评论(0) 推荐(0)
摘要: AC自动机的失配函数的利用和DP,Trie图中的每个节点代表一种状态,即一个字符串的后缀为从根节点到本节点的字符串。就是说把字符串根据他的后缀分为不同的类别,AC自动机上的每一个节点代表一个类别。在一个字符串的后面再加一个字符,此字符串就会从Tire图中的一个节点转移到另一个节点,这个过程可通过失配函数的求解过程中求出。其中有的节点所代表的类是不合法的,要记录下来。然后就是dp,ans[i][j]表示母串的i长度的串要变成状态为j的串所需最小修改次数。初始化为无穷大,如果j不合法不求,并且j的下一个转移得到的节点也不从j转移得到,最后比较每个节点的ans[len][j],得到最小值。 1 #. 阅读全文
posted @ 2013-05-27 13:53 LJ_COME!!!!! 阅读(164) 评论(0) 推荐(0)
摘要: 三分法求下凸函数的最小值,可知,max(下凸函数,下凸函数)得到的函数认为下凸函数 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 const int maxn=10000+10; 6 double a[maxn],b[maxn],c[maxn]; 7 int n; 8 double solve(double x) 9 {10 double maxv=a[0]*x*x+b[0]*x+c[0];11 for(int i=0;i<n; 阅读全文
posted @ 2013-05-22 21:03 LJ_COME!!!!! 阅读(164) 评论(0) 推荐(0)
摘要: 贪心,没完全理解啊,明天再想想,今天已经想了一天了,唉 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int maxn=1000+10; 6 int tian[maxn],qi[maxn]; 7 int main() 8 { 9 int n;10 while(scanf("%d",&n)&&n)11 {12 int i,j;13 for(i=1;i<=n;i++) 阅读全文
posted @ 2013-05-22 00:58 LJ_COME!!!!! 阅读(145) 评论(0) 推荐(0)
摘要: 通过枚举每个点,也就是枚举可能的每个教练,得到在他之前的比他小的数的个数,比他大的数的个数,他之后的比他小的数的个数,比他大的数的数的个数,这个过程可通过树状数组等手段进行优化 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define LL long long 5 using namespace std; 6 const int maxn=20000+10; 7 const int maxm=100000; 8 int n,a[maxn],sm1[maxn],sm2[ma 阅读全文
posted @ 2013-05-21 14:59 LJ_COME!!!!! 阅读(151) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 ··· 17 下一页