摘要: 如果不算pre指针的话后缀自动机就是一个DAG,这是它能很方便地进行dp的前提。 而pre指针返回什么呢,返回的就是上一个的前缀包含改结点所代表子串的那个后缀,和AC自动机上的fail指针很像,都是为了匹配。我目前学得不深,看不出和AC自动机的fail指针有什么区别,用起来也几乎一样。 相比于字典树 阅读全文
posted @ 2016-05-04 00:26 __560 阅读(782) 评论(0) 推荐(0) 编辑
摘要: 之零: 这一篇都是水题,不过还是有几道被卡了一下,还是总结一下。 A题: 给定a和b的gcd和lcm,求一组满足的a,b,且a最小。 显然,a,b必然是gcd的倍数,是lcm的约数,如果gcd不是lcm的约数则无解,否则,要使a最小,a只能是gcd,又因为b是gcd的倍数,那么b就只能是a的倍数,也 阅读全文
posted @ 2016-04-19 11:50 __560 阅读(599) 评论(0) 推荐(0) 编辑
摘要: //接口:Gauss();解存在x数组中。equ,var分别表示方程个数和变量的个数,(因为是变量 的个数不算常数的个数)要赋值。a就是行列式,其中常数是在方程右侧的符号。 int const maxn = 2000; const double eps=1e-10; double a[maxn][m 阅读全文
posted @ 2016-10-31 16:30 __560 阅读(388) 评论(0) 推荐(0) 编辑
摘要: 1,快速补完最近区域赛网络赛和多校题,学习补充掌握比赛中需要用到的知识点,注意整理。2,补充寒假漏掉的知识点,并进行少量比赛。3,比赛训练。 多校1 A,简单并查集,solve。 B,简单sg,solve。 C,难且麻烦的计数,放弃。 D,区间gcd=x的区间个数,区间gcd收敛快,solve。 E 阅读全文
posted @ 2016-10-27 17:13 __560 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 1011:水题。 #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long 阅读全文
posted @ 2016-08-15 02:04 __560 阅读(1810) 评论(0) 推荐(0) 编辑
摘要: 题目比较基础。 A题: 算字符串连续子串的hash,线段树维护hash,这里并不是标准的hash,所以没难度。 当然用前缀和+逆元好像也可以,不过我没想清楚如果被除数为0怎么处理逆元。 #pragma comment(linker, "/STACK:102400000,102400000") #in 阅读全文
posted @ 2016-05-16 17:25 __560 阅读(417) 评论(0) 推荐(0) 编辑
摘要: 通过用LCT维护parent树来实现后缀自动机的在线操作。 注意right值初始化为0,然后加新结点的时候只要将np的right值设为1,而不需要改变nq的right值,因为nq是内部的结点,np才是外层的结点。 思路很简单,代码真长,调了挺久。。。。不过写起来还算清晰。。。 #include<bi 阅读全文
posted @ 2016-05-05 18:23 __560 阅读(749) 评论(0) 推荐(0) 编辑
摘要: 给定两个串,分别截取字串X和Y,连接组成X+Y,求不同的X+Y的方案数。 对于X+Y,如果重复的部分其实就是从同一个X+Y的某个地方断开弄成不同的X和Y,那么只要使得X和X+Y匹配得最长就行了。 因此,对两个字符串分别建立后缀自动机A和B,在A中找字串X,当X的末尾不能接某个字符c时,在B中找以c为 阅读全文
posted @ 2016-05-04 11:27 __560 阅读(779) 评论(0) 推荐(0) 编辑
摘要: 就用spoj1812的代码做模版吧。。。 #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typede 阅读全文
posted @ 2016-05-04 00:27 __560 阅读(510) 评论(0) 推荐(0) 编辑
摘要: 可能是最后的一场bestcoder,没上div1确实是有点遗憾,,,这场题目比较简单,认真打的话AK应该问题不大。 01: 判断n=x^2-y^2是否有正整数解。由于上场codeforces中毒了,这次一看01直接懵了。。。不会。。。赛后一想,,,果然水题。。。。 n=(x+y)*(x-y) , 令 阅读全文
posted @ 2016-05-02 20:40 __560 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 难得打一场bc,FST了两道,显然我还不在最佳状态,但是我已经感觉到提高了。 这一场比赛开始一个小时后才看的题,当时只剩40分钟,不过由于我急于涨分,所以决定看题,先看C题,很简单的矩阵快速幂+费马小定理降幂,但是调了好久。。。确实不在状态。。。不过还是写完了,,,然后剩下十分钟顺手过了B和A题。最 阅读全文
posted @ 2016-04-18 15:48 __560 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 每次合并两个同余模方程,然后用exgcd解即可。 ll LCM(ll a,ll b) { return a/__gcd(a,b)*b; } void exgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(b==0){ x=1;y=0;d=a; return; } exgcd 阅读全文
posted @ 2016-04-18 12:24 __560 阅读(590) 评论(0) 推荐(0) 编辑
摘要: 分块,K小的时候dp,K大的时候直接枚举K的倍数然后判断。 已经尽力优化了,还是没过,,,先留代码,有时间再改。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> # 阅读全文
posted @ 2016-04-07 16:34 __560 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 统计一个字符串中不相交的回文串的对数。 枚举以i为右端点的回文串,乘以在区间[i+1,n]的回文串个数,累加即可。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> 阅读全文
posted @ 2016-04-07 13:47 __560 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 直接从两棵树的奇根和偶根dfs就可以了。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> #define REP(i,a,b) for( 阅读全文
posted @ 2016-04-07 13:07 __560 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 回文树在处理回文方面真的比manacher要好用得多。。。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define REP(i,a,b) for(int i 阅读全文
posted @ 2016-04-07 01:14 __560 阅读(442) 评论(0) 推荐(0) 编辑
摘要: len[u]表示结点u所表示的回文串长度,cnt[u]表示结点u所表示的回文串出现次数,num[u]表示结点u的后缀回文串个数(包括自己)。 由于一个字符串本质不同的回文串最多不超过n个,所以空间开n+2即可,算上每个结点的26个Next指针,空间复杂度o(26*n)。时间复杂度o(n)。 stru 阅读全文
posted @ 2016-04-07 00:36 __560 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 回文树的裸题。 #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long l 阅读全文
posted @ 2016-04-07 00:31 __560 阅读(476) 评论(0) 推荐(1) 编辑
摘要: 由于可以预处理出每个左端点对应的右端点,所以并不需要开二维,复杂度应该是介于n和n^2之间。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define REP 阅读全文
posted @ 2016-04-05 12:20 __560 阅读(216) 评论(0) 推荐(0) 编辑
摘要: #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) me 阅读全文
posted @ 2016-04-05 12:11 __560 阅读(362) 评论(0) 推荐(0) 编辑
摘要: /// D-MST struct Edge { int u,v,w; };Edge e[maxn];int en; int in[25100]; int pre[25100],ID[25100],vis[25100]; /// D-MST 点的标号必须是0~N-1,不能改为0~N或1~N int D 阅读全文
posted @ 2016-04-05 12:10 __560 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 今晚我要涨分! 阅读全文
posted @ 2016-03-28 23:11 __560 阅读(203) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4569 首先如果f(x)%(p*p)=0,则必有f(x)%p=0,因此解x必然在满足f(x)%p=0的集合中。 接着注意到p为质数,f(x)为多项式,那么满足f(x)%p=0的集合在p的剩余系中必然很少,而由于f( 阅读全文
posted @ 2016-03-28 15:29 __560 阅读(525) 评论(0) 推荐(0) 编辑
摘要: double F(double x) { } /// simpson求定积分 double simpson(double a,double b,double tk,double ta,double tb) { double c=a+(b-a)/2; return (F(a)+4*F(c)+F(b)) 阅读全文
posted @ 2016-03-28 15:04 __560 阅读(556) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4498 simpson公式可以求连续曲线的定积分。 这里注意解ax^2+bx+c=0时a=0,退化为一次的情况。 #include<iostream> #include<cstdio> #include<cstri 阅读全文
posted @ 2016-03-28 14:55 __560 阅读(795) 评论(0) 推荐(0) 编辑
摘要: = = 阅读全文
posted @ 2016-03-27 18:21 __560 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 并查集删点就是弄个id记录当前点的id,删除的时候将id设为新的id,忽略原来的id,当然还要注意去改变原来集合需要维护的性质比如元素个数等等。 这题的坑点在于第二个操作,把u放在u所在集合的时候直接忽略,而不是把u拿出来。 阅读全文
posted @ 2016-03-17 11:41 __560 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 数据结构: http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=676&pid=1003 http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php 阅读全文
posted @ 2016-03-17 09:37 __560 阅读(280) 评论(0) 推荐(0) 编辑
摘要: http://codeforces.com/contest/293/problem/E 题意:求树上合法点对的个数。合法条件为:路径长度<=W,路径边数<=L。 显然是点分治。求解的时候第一维直接滑窗,第二维插入treap中统计,滑窗的时候删掉即可。 阅读全文
posted @ 2016-03-16 19:01 __560 阅读(552) 评论(0) 推荐(0) 编辑
摘要: 这次写不容斥的版本,WA了好几次,又改成容斥的,还是没过,一怒之下把所有的int改成longlong就过了。。。 阅读全文
posted @ 2016-03-15 23:17 __560 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 这里要求输出字典序最小的两个点,就不能像之前那样容斥了,只能直接搞了。 直接搞的话,需要避开n^2,由于这里是等式,显然应该考虑hash映射。从前往后依次枚举计算每棵子树,对于每个子树结点,快速从前面已经计算过的子树中找到答案更新就可以了。 很简单的东西,只是难以用文字解释得清楚。大概一般点分治不用 阅读全文
posted @ 2016-03-15 17:46 __560 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 和上一道一样,只是把<=K改成=K就行了,不过算起来难度增加了一点,滑窗的时候容易滑错。 这次我把端点在根的也弄到第三种情况一起搞,也就是分两种情况,经过根和完全在子树里。这样写起来也之前写的简洁不少。   阅读全文
posted @ 2016-03-15 12:31 __560 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 直接用主席树维护下分数和个数就行了,思路挺好想的,不过比赛的时候我死活都没往主席树上想。。。唉。。。 然后需要注意的地方是, 1,区间更新时需要标记永久化,也就是标记不下放。 2,开64倍空间。一般开结构体会多用一些空间,所以空间比较紧的时候可以改成数组。 最后说说坑点,RE返回T。。。不过开64倍 阅读全文
posted @ 2016-03-14 22:19 __560 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 入门题,算是对树分治有了初步的理解吧。  对于点分治,我的理解就是进行logn次暴力,每次暴力的复杂度为n,总复杂度为n*logn。   阅读全文
posted @ 2016-03-14 20:37 __560 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 今天认真看了下紫书上的点分治的入门题,我有点理解点分治的复杂度和原理了,于是我去写了这道入门题,然后T了,我以为是题目SB卡常数,弄了组大数据后发现是自己SB,我的程序没跑出来,标程秒出。。。看来我的理解可能有点问题,今晚就弄一下树分治,试着补第三场的那道树分治的题吧。 原来是找根的时候找错了, 阅读全文
posted @ 2016-03-14 19:25 __560 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 直接dfs就可以了,记忆化都不需要。。复杂度o(N)   阅读全文
posted @ 2016-03-14 16:24 __560 阅读(416) 评论(0) 推荐(0) 编辑
摘要: B题: 比赛的时候我又没仔细看题,又把题目读错了。。。虽然读对的话我也不一定能想出如何用加权并查集做。比赛的时候我的第一感觉就是splay模拟,赛后写了一下,TLE了。。。 #include<iostream> #include<cstdio> #include<cstring> #include< 阅读全文
posted @ 2016-03-12 10:35 __560 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 训练赛第二场的I题,上完体育课回来就把这题过了,今天训练赛rank1了,还把大大队虐了,而且我还过了这道题 (虽然我也就过了这道题。。。),第一次在比赛中手写AC自动机还带dp的,心情大好。 给一个字符串集合,求包含该集合超过K个字符的,长度为L的字符串的个数。 显然是在AC自动机上跑dp,设dp[ 阅读全文
posted @ 2016-03-11 23:22 __560 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 题意:多次操作和询问,操作是增加新的模版串,询问是询问匹配。 思路:如果每次插入重建AC自动机的话,需要重建n次,每次重建复杂度为n^2。 弄两个AC自动机A和B,B限制结点数上限为sqrt(n),每次增加新的模版串的时候将它插到B中,重建B,当B结点数达到sqrt(n)时,将B合并到A中,重建A。 阅读全文
posted @ 2016-03-10 12:47 __560 阅读(554) 评论(0) 推荐(0) 编辑
摘要: 只要把每行的模版串插到ac自动机,然后匹配行,每次匹配成功,那一行对应的字符矩阵的左上角的计数器+1,最后统计下计数器矩阵有多少个左上角是行数的就可以了。 思路很简单,但想法很好,但要注意模版上有两行是一样的,插入到ac自动机的时候会插到同一个结点上,为了区分,我还是谨慎地开了个vector,然后1 阅读全文
posted @ 2016-03-10 01:06 __560 阅读(260) 评论(0) 推荐(0) 编辑